Wie weise ich 10000 Datensätze Variablen zu, ohne Indizierte

Anfängerfragen zum Programmieren mit PureBasic.
mario26
Beiträge: 4
Registriert: 09.08.2010 11:59

Wie weise ich 10000 Datensätze Variablen zu, ohne Indizierte

Beitrag von mario26 »

Hallo Basicfreunde

Habe schon viel in Basic programmiert. Meist grosse Datenmengen durchsucht und zu neuen Datensätzen zusammengeführt. Nun bittet mich ein Freund, das Gleiche mit seinen Daten (zehntausend Datensätze) und PureBasic zu machen. Kein Problem, dachte ich. Datensätze einlesen, in 10 Teile zerlegen, nach Kriterien durchsuchen und aus 3-10 Datensätzen einen neuen machen. Mit Indizierten Variablen in einer verschachtelten For-Next Schleife ist sowas schnell gelöst. Aber PureBasic versteht keine Indizierten Variablen.
Mir fällt keine Lösung ein. Kann einer von euch mir auf die Spünge helfen ???

Datenstruktur roh so:
Zweiheim;Ludwig;M 01183;Asien;ABC-Inseln (Ambon, Buru, Ceram);Region;;Indonesien;;
Miler;Rainer;M 02050;Asien;ABC-Inseln (Ambon, Buru, Ceram);Region;;Indonesien;;
Rohmeier;Rosi;M 02345;Karibik;ABC-Inseln (Aruba, Bonaire, Curacao);Verweis;Niederländische Antillen;;2009;Aruba
Burkwaldt;Siegride;M 02585;Karibik;ABC-Inseln (Aruba, Bonaire, Curacao);Verweis;Niederländische Antillen;;2003;
Stritzel;Hartmut;M 02012;Asien;Abu Dhabi;Region;;Vereinigte Arabische Emirate;2007;
Vorgen;Lorenz;M 02581;Asien;Abu Dhabi;Region;;Vereinigte Arabische Emirate;häufig;
Petermann;Klaus-Günther;M 00188;Asien;Afghanistan;Staat;;;2005;
Fortin;Peter;M 00551;Asien;Afghanistan;Staat;;;1998;
Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2003;Landreise mit dem Auto
Johannes;Rolf;M 02375;Asien;Afghanistan;Staat;;;2003;
Küste;Barbara;M 02773;Asien;Afghanistan;Staat;;;2005;insges. 21 Mon. berufl.
Küste;Barbara;M 02773;Asien;Afghanistan;Staat;;;2004;
Küste;Barbara;M 02773;Asien;Afghanistan;Staat;;;2003;
Lodhart;Hermann;M 00922;Afrika;Afrika;Erdteil;;;2007;Marokko, Westsahara, Senegal, Mali, Burkina Faso,
Henel;Maria;M 01120;Afrika;Afrika;Erdteil;;;häufig;
Hirni;Horst;M 02594;Afrika;Afrika;Erdteil;;;2004;über Land nach Kapstadt
Schmitz;Falk;M 02675;Afrika;Afrika;Erdteil;;;2005;
Schmitz;Falk;M 02675;Afrika;Afrika;Erdteil;;;2004;
Eilig;Sebastian;M 02797;Afrika;Afrika;Erdteil;;;2003;ganzer Kontinent
Eilig;Sebastian;M 02797;Afrika;Afrika;Erdteil;;;2002;ganzer Kontinent

Gewünschtes Ergebnis:
Zweiheim;Ludwig;M 01183;Asien;ABC-Inseln (Ambon, Buru, Ceram);Region >;;Indonesien;;
Miler;Rainer;M 02050;;;;;;;
Rohmeier;Rosi;M 02345;Karibik;ABC-Inseln (Aruba, Bonaire, Curacao);Verweis >;Niederländische Antillen;;2009;Aruba
Burkwaldt;Siegride;M 02585;;;;;2003;
Stritzel;Hartmut;M 02012;Asien;Abu Dhabi;Region;;Vereinigte Arabische Emirate;2007;
Vorgen;Lorenz;M 02581;;;;;;häufig;
Petermann;Klaus-Günther;M 00188;Asien;Afghanistan;;;;2005;
Fortin;Peter;M 00551;Asien;;;;;1998;
Kanzler;Robert Willhelm;M 02148;;;;;;2003;Landreise mit dem Auto
Johannes;Rolf;M 02375;;;;;;2003;
Küste;Barbara;M 02773;;;;;;2005,2004,2003;insges. 21 Mon. berufl.
Lodhart;Hermann;M 00922;Afrika;;;;;2007;Marokko, Westsahara, Senegal, Mali, Burkina Faso,
Henel;Maria;M 01120;;;;;;häufig;
Hirni;Horst;M 02594;;;;;;2004;über Land nach Kapstadt
Schmitz;Falk;M 02675;;;;;;2005,2004;
Eilig;Sebastian;M 02797;;;;;;2003,2002;ganzer Kontinent

Habt ihr einen Lösungsvorschlag mit Pure Basic 4.5 64bit auf Windows 7 64 bit Plattforn ??

in freudiger Erwartung
Mario26
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von Kiffi »

Mit Indizierten Variablen in einer verschachtelten For-Next Schleife ist sowas schnell gelöst.
poste mal bitte ein Snippet in dem von Dir bevorzugten Basic-Dialekt.
Vielleicht verstehe ich dann besser, was Du mit 'indizierten Variablen' meinst. ;-)

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von STARGÅTE »

Sollte das nicht mit einem Array zu erledigen sein ?
Die Felder haben dabei eine Struktur vom Datensatz und einen *Pointer welcher ggf. auf ein Parent-Datensatz zeigt.
Falls ich das richtig verstanden hab was du da eigentlich machen willst ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
mario26
Beiträge: 4
Registriert: 09.08.2010 11:59

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von mario26 »

Hi Kiffi

Laufvariable indiziert mit den Ergebnis der For - Next Schleife
vereinfracht mit nur drei Datensätzen dargestellt ohne die erforderlichen Read und Durchsuchbebefehle

For a = 1 to 3 = liest Datensatz(1)
For b = 1 to 10 = Zerlegt Datensatz (a)
Datensatz(a) = Zweiheim;Ludwig;M 01183;Asien;ABC-Inseln (Ambon, Buru, Ceram);Region;;Indonesien;;
Teil(1), = Zweiheim
Teil(2), = Ludwig
Teil(3), = M 01183
Teil(4), = Asien
Teil(5), = ABC-Inseln (Ambon, Buru, Ceram)
Teil(6), = Region
Teil(7), = ""
Teil(8), = Indonesien
Teil(9), = ""
Teil(10) = ""
next b
next a

etc. etc
danach vergleiche ich die Daten von Datensatz(1) mit den Daten von 2-10 und bile4 daraus einen neuen Datensatz der zurüch auf die Platte geschrieben wird. Je nach Ergebnis der Suche wird Datensatz 2-?? gelöscht und mit dem nächsten nicht Gelöschten weitergemacht.

ZB: Gfa Basic, Aber auch Visual Basic
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von STARGÅTE »

Na für sowas eignen sich doch LinkedLists ...
Datensätze reinschmeißen, mit ForEach durchlaufen, mit StringField() zerteilen ... und mit DeleteElement() löschen ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
mario26
Beiträge: 4
Registriert: 09.08.2010 11:59

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von mario26 »

Hallo Stargate

Hab mir LinkedLists mal angeschaut. So schnell ergibt sich für mich keine Idee für eine Lösung. Das scheitert schon bei der Übernahme der Daten in LinkedLists bei der Demo. Vielleicht kanst du mal eine Demo mit den Daten von oben schreiben bei denen das gewünschte Egebnis herauskommt.

Zum Verständnis:
Datensatz1=Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2003;Landreise mit dem Auto
Datensatz2=Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2004;mit öffentlichen Verkehrsmitteln
Datensatz3=Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2005;mit dem Fahrrad

Teil(1), = Kanzler = Name soll nur einmal vorkommen
Teil(2), = Robert Willhelm
Teil(3), = M 02148
Teil(4), = Asien
Teil(5), = Afghanistan
Teil(6), = Staat
Teil(7), = ""
Teil(8), = ""
Teil(9), = 2003
Teil(10) = Landreise mit dem Auto

Neuer Datensatz aus den Dreien die die gleiche M Nummer (M 02148) haben und Afghanistan bereist haben soll der neue Datensatz der zurückgeschrieben wird so aussehen:
Datensatzneu1 = Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2005,2004,2003;mit dem Fahrrad,mit öffentlichen Verkehrsmitteln,Landreise mit dem Auto

Datensatzneu2 = Johannes;Rolf;M 02375;;;;;;2003;
Datensatzneu3 = Küste;Barbara;M 02773;;;;;;2005,2004,2003;insges. 21 Mon. berufl.


Wenn die folgenden Datensätze mit anderen M Nummern auch noch "Asien;Afghanistan;Staat" in Teil(4);Teil(5), und Tel(6) enthalten, sollen diese in den folgenden Datensätzen durch leerre Feldinhalte ersetzt werden bis ein abweichendes Ziel erscheint.

Ich hoffe ich habe mich verständlich ausgedrückt.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von c4s »

Hier ein erster Anfang zum Laden der Daten:

Code: Alles auswählen

EnableExplicit


Structure Daten
	Teil1.s
	Teil2.s
	Teil3.s
	Teil4.s
	Teil5.s
	Teil6.s
	Teil7.s
	Teil8.s
	Teil9.s
	Teil10.s
EndStructure
Global NewList Datensatz.Daten()


Define File.s, FileNr
Define String.s, StringCount
Define Success


File = OpenFileRequester("", "Dateiliste öffnen:", "Text (*.txt)|*.txt;|Alle Dateien (*.*)|*.*", 0)
If Len(File) = 0 : End : EndIf

FileNr = ReadFile(#PB_Any, File)
If FileNr
	While Eof(FileNr) = 0
		String = ReadString(FileNr)

		If AddElement(Datensatz())
			With Datensatz()
				\Teil1 = StringField(String, 1, ";")
				\Teil2 = StringField(String, 2, ";")
				\Teil3 = StringField(String, 3, ";")
				\Teil4 = StringField(String, 4, ";")
				\Teil5 = StringField(String, 5, ";")
				\Teil6 = StringField(String, 6, ";")
				\Teil7 = StringField(String, 7, ";")
				\Teil8 = StringField(String, 8, ";")
				\Teil9 = StringField(String, 9, ";")
				\Teil10 = StringField(String, 10, ";")
			EndWith

			StringCount + 1
		EndIf
	Wend

	CloseFile(FileNr)

	MessageRequester("Ergebnis", "Fertig!" + #CRLF$ + Str(StringCount) + " Datensätze wurden geladen.")
	Success = #True
Else
	MessageRequester("Fehler!", "Konnte Datei nicht öffnen.")
	Success = #False
EndIf


If Success = #True
	; Hier eventuell etwas mit den geladenen Daten anstellen...
EndIf
Zuletzt geändert von c4s am 10.08.2010 23:35, insgesamt 1-mal geändert.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von STARGÅTE »

Hier der Code der die gewünschten veränderungen macht:
Einlesen, Filter, Zusammenführen, Ausgebe:

Code: Alles auswählen

Structure Item
  Array Field.s(10)
EndStructure

Global NewList Item.Item()

; Einlesen
Restore Rohdaten
Read.s String$
While String$
  AddElement(Item())
  Item()\Field(0) = String$ ; Rohdaten
  ; Zerstückeln
  For Index = 1 To 10
    Item()\Field(Index) = StringField(String$, Index, ";")
  Next
  Read.s String$
Wend

; Filtern
ForEach Item()
  *Item.Item = @Item()
  While NextElement(Item())
    If Item()\Field(3) = *Item\Field(3) ; Gleiche M-Nummer
      ; Zusammführen
      For Index = 1 To 10
        If Item()\Field(Index) <> *Item\Field(Index)
          *Item\Field(Index) + "," + Item()\Field(Index)
        EndIf
      Next
      DeleteElement(Item())
    EndIf
  Wend
  ChangeCurrentElement(Item(), *Item)
Next

; Neue Datensätze
ForEach Item()
  Item()\Field(0) = Item()\Field(1)
  For Index = 2 To 10
    Item()\Field(0) + ";" + Item()\Field(Index)
  Next
Next


; Ausgabe
ForEach Item()
  Debug Item()\Field(0)
Next




DataSection
  Rohdaten:
  Data.s "Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2003;Landreise mit dem Auto"
  Data.s "Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2004;mit öffentlichen Verkehrsmitteln"
  Data.s "Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2005;mit dem Fahrrad"
  Data.s "Kanzler;Robert Willhelm;M 05686;Asien;Afghanistan;Staat;;;2003;Landreise mit dem Auto"
  Data.s "Kanzler;Robert Willhelm;M 05686;Asien;Afghanistan;Staat;;;2004;mit öffentlichen Verkehrsmitteln"
  Data.s "Kanzler;Robert Willhelm;M 05686;Asien;Afghanistan;Staat;;;2005;mit dem Fahrrad"
  Data.s ""
EndDataSection
Aus:
Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2003;Landreise mit dem Auto
Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2004;mit öffentlichen Verkehrsmitteln
Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2005;mit dem Fahrrad
Kanzler;Robert Willhelm;M 05686;Asien;Afghanistan;Staat;;;2003;Landreise mit dem Auto
Kanzler;Robert Willhelm;M 05686;Asien;Afghanistan;Staat;;;2004;mit öffentlichen Verkehrsmitteln
Kanzler;Robert Willhelm;M 05686;Asien;Afghanistan;Staat;;;2005;mit dem Fahrrad
wird:
Kanzler;Robert Willhelm;M 02148;Asien;Afghanistan;Staat;;;2003,2004,2005;Landreise mit dem Auto,mit öffentlichen Verkehrsmitteln,mit dem Fahrrad
Kanzler;Robert Willhelm;M 05686;Asien;Afghanistan;Staat;;;2003,2004,2005;Landreise mit dem Auto,mit öffentlichen Verkehrsmitteln,mit dem Fahrrad
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von DarkDragon »

Also es ist wohl noch nicht ganz so wie du dein Ergebnis haben willst, aber schau mal das hier an:

Code: Alles auswählen

; Das hier musst du anpassen:
#FILENAME_SOURCE$ = "test.csv"
#FILENAME_DESTINATION$ = "test_new.csv"

; Also angenommen du kennst die Anzahl der Datensätze, 
; dann ist ein Array von Vorteil, ansonsten 
; solltest du eine LinkedList verwenden:

Structure Datensatz
  OriginalText.s
  Felder.s[10] ; Es gibt 10 Felder pro Datensatz
  Zusammengefasst.i
EndStructure

NewList Daten.Datensatz()
Define k.i

; Lese die Datei Zeilenweise ein:
If ReadFile(0, #FILENAME_SOURCE$)
  While Eof(0) = 0
    AddElement(Daten())
    Daten()\OriginalText = ReadString(0)
    Daten()\Zusammengefasst = #False ; Dieser Datensatz wurde noch nicht zusammengefasst
    
    ; Jetzt finde die Felder innerhalb des Strings
    For k = 0 To 9
      Daten()\Felder[k] = StringField(Daten()\OriginalText, k + 1, ";")
    Next k
  Wend
  CloseFile(0)
Else
  Debug "Angegebene Datei nicht vorhanden."
EndIf

; Sortiere die Daten nach dem ersten Feld um im nächsten Schritt effizienter zu arbeiten
SortStructuredList(Daten(), #PB_Sort_Ascending, OffsetOf(Datensatz\Felder), #PB_Sort_String)

; Fasse die Daten zusammen
Define *CurrentElement.Datensatz

ForEach Daten()
  If Not Daten()\Zusammengefasst
    ; Merke das aktuelle Element
    *CurrentElement = @Daten()
    
    ; Suche nun die darauffolgenden Datensätze ab ob sie einen selben Namen enthalten
    While NextElement(Daten())
      If Daten()\Felder[0] = *CurrentElement\Felder[0]
        ; Füge den restlichen Text mit einem Komma an das aktuelle Element an ...
        For k = 1 To 9
          ; ... aber nur wenn der Text nicht schon im aktuellen Element steckt
          If FindString("," + *CurrentElement\Felder[k] + ",", "," + Daten()\Felder[k] + ",", 1) = 0
            *CurrentElement\Felder[k] + "," + Daten()\Felder[k]
          EndIf
        Next k
        
        ; Alternativ könnte man das Element auch löschen
        Daten()\Zusammengefasst = #True
      Else
        ; Das erste Feld stimmt nichtmehr überein, also können wir hier die innere Schleife verlassen,
        ; denn die Liste ist ja sortiert.
        Break
      EndIf
    Wend
    
    ; Springe zum alten Element zurück
    ChangeCurrentElement(Daten(), *CurrentElement)
  EndIf
Next

; Schreibe es in eine neue Datei rein:
If CreateFile(0, #FILENAME_DESTINATION$)
  ForEach Daten()
    If Not Daten()\Zusammengefasst
      For k = 0 To 8
        WriteString(0, Daten()\Felder[k] + ";")
      Next k
      ; und nun einen Zeilenumbruch nach dem letzten Feld
      WriteStringN(0, Daten()\Felder[k])
    EndIf
  Next
  
  CloseFile(0)
EndIf
[EDIT]
Schad, da hab ich zwischenzeitlich mal etwas anderes gemacht und jetzt war alles umsonst. :(
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi

Beitrag von STARGÅTE »

Immerhin hat er nun genug verschiedene Vorgehensweisen ^^

Und irgendwie habe ich das gefühl wir wissen immer noch nicht was er vorhat ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten