Seite 1 von 2
Wie weise ich 10000 Datensätze Variablen zu, ohne Indizierte
Verfasst: 09.08.2010 12:52
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
Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 13:03
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
Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 13:18
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 ^^
Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 14:14
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
Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 14:22
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 ...
Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 15:31
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.
Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 15:46
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
Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 15:53
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
Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 16:21
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.

Re: Wie weise ich 10000 Datensätze Variablen zu, ohne Indizi
Verfasst: 09.08.2010 21:00
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 ...