48507
Goto Top

Datei auslesen und Datensätze zusammenfassen

Moin!

Ich habe eine Datei, die so aufgebaut ist:

01PersonalnummerX NameNachnameWohnort
02PersonalnummerX AndereDaten Daten
05PersonalnummerX AndereDaten Daten
01PersonalnummerY NameNachnameWohnort
02PersonalnummerY AndereDaten Daten
06PersonalnummerY DatenDaten
08PersonalnummerY DatenDaten
Zu der Datei gehört eine Beschreibung, in der steht, wie lang eine Spalte ist. Ich muss also die "Strings" auseinander nehmen.

01 markiert immer den Datensatz-Anfang (Stammdaten), alles, was dahinter kommt, sind "historische" Daten.

Problem: Wenn ich die Datei zeilenweise auslese, wie kann ich dann die historischen Daten "anhängen"? Ziel: Eine CSV-Datei, die dann so aussieht:

01;PersonalnummerX;Name;Nachname;Wohnort;02;PersonalnummerX;AndereDaten;Daten;05;PersonalnummerX;AndereDaten;Daten
01;PersonalnummerY;Name;Nachname;Wohnort;02;PersonalnummerY;AndereDaten;Daten;06PersonalnummerY;Daten;Daten;08;PersonalnummerY;Daten;Daten
Die Personalnummer ist eindeutig. Zeilenweise einlesen ist auch kein Problem. Jedoch: Wie hänge die Daten hinten dran?

Jemand eine Idee?

Danke!

Content-ID: 193804

Url: https://administrator.de/forum/datei-auslesen-und-datensaetze-zusammenfassen-193804.html

Ausgedruckt am: 10.04.2025 um 20:04 Uhr

andimue
andimue 06.11.2012 um 13:02:36 Uhr
Goto Top
Servus sputnik,

in was für eine "Sprache" willst du denn die csv erstellen: vbs, batch, powershell oder ist das egal?

Also im Batch würde ich die Datei Zeile für Zeile lesen und mir eine Variable aufbauen, die ich solange ergänze, bis der nächste 01-Satz kommt, dann kannst du die Variable in eine Datei ausgeben.
Das Problem wird wohl eher das Zerlegen anhand der "Beschreibung" sein. Ist diese Beschreibung fix oder kann die sich immer mal wieder ändern?
48507
48507 06.11.2012 aktualisiert um 13:27:10 Uhr
Goto Top
Die Beschreibung ist fix, jedenfalls im Moment. Hm, ich stehe auf dem Schlauch. An welcher Stelle genau muss ich das Array füllen? Bin soweit gekommen:

    Do Until objTextFile.AtEndOfStream
        
		ZeileTemp = objTextFile.Readline
						
		IF InStr(Left(ZeileTemp,2), "01") THEN  
									
			FertigeZeile = Mid(ZeileTemp,1,2) _
			& ";" & trim(Mid(ZeileTemp,3,12)) _  
                        ....
                        ....
			objFile.WriteLine FertigeZeile
				
                END IF
		
    Loop

Muss wohl die Zeilen vorher zählen? Die Anzahl der historischen Zeilen ist variabel.
TsukiSan
TsukiSan 06.11.2012 aktualisiert um 13:26:13 Uhr
Goto Top
Das Problem wird wohl eher das Zerlegen anhand der "Beschreibung" sein.
Ich sehe das Problem bei folgendem:
die fertige CSV-Datei soll so aufgebaut sein:
01;PersonalnummerY;Name;Nachname;Wohnort;02;PersonalnummerY;AndereDaten;
Wenn nicht klar definiert ist, wie die ; hinkommen, da wird es eng werden

Gruss
Tsuki
48507
48507 06.11.2012 um 13:28:46 Uhr
Goto Top
Definiert ist es in der "Beschreibung". Bsp: Feld1: Länge 2, von 1 bis 2. Die Beschreibung ist aber nicht das Problem...
TsukiSan
TsukiSan 06.11.2012 aktualisiert um 13:34:34 Uhr
Goto Top
Hallo sputnik,

bei der "ersten" Zeile 01 hast du mittels
mid(,1,2)
'und  
mid(,3,12)
definiert, wie das da aussieht.
Wie und wo soll das ; danach gesetzt werden? Gibt es im Datensatz
Trennzeichen ?

Gruss
Tsuki
48507
48507 06.11.2012 aktualisiert um 13:40:02 Uhr
Goto Top
Das ; wird ergänzt durch:

& ";" &  

Trennzeichen gibt es eben nicht, aber dank der Beschreibung weiß ich, wo ein Feld zu Ende ist... deswegen auch das mid().
TsukiSan
TsukiSan 06.11.2012 um 14:08:34 Uhr
Goto Top
Nun, dann würde ich das ganze in "Pakete" aufteilen und dann die einzelnen Zeilen drinnen "zusammenfassen".

Beispiel:
Set FSO = CreateObject("Scripting.FileSystemObject")  
MeineDaten = Split(FSO.OpenTextFile("MeineDatenbank.db", 1).ReadAll,"01")  
Das jetzige Array MeineDaten hat nun alle anderen Daten zwischen "01" enthalten.
Diese könnten dann mittels
For i = 0 to Ubound(MeineDaten)
MeinDatensatz = Split(MeineDaten(i),vbrclf)
'...weitere Aufsplittung und Zusammenführung  
Next
zusammengefügt werden. JOIN wäre eine Möglichkeit.

Guss
Tsuki
48507
48507 06.11.2012 um 14:17:49 Uhr
Goto Top
01 kann aber auch in den Daten stehen, z.B. in Datumsangaben. Trotzdem danke face-smile
TsukiSan
TsukiSan 06.11.2012 um 14:35:45 Uhr
Goto Top
Dann natürlich zeilenweise einlesen und zusammenfügen.
Sorry, aber ich glaubte, es gäbe eine einfachere Lösung für dich.

Deine Anforderung gibt zu viele Möglichkeiten. Das kann eine CPU "wuschig" machen.
Eventuell hat jemand die Blitzidee.

Viele Grüße

Tsuki
pieh-ejdsch
pieh-ejdsch 06.11.2012 um 15:11:12 Uhr
Goto Top
moin,

Zu der Datei gehört eine Beschreibung, in der steht, wie lang eine Spalte ist. Ich muss also die "Strings" auseinander nehmen.
Und wie sieht davon eine Zeile aus?
Anhand dieser kann doch jede Spalte abgezählt werden.

Gruß Phil
bastla
bastla 06.11.2012 aktualisiert um 15:22:43 Uhr
Goto Top
Hallot sputnik!

Nur ganz nebenbei:
01 kann aber auch in den Daten stehen, z.B. in Datumsangaben.
Die Kombination
vbNewline & "01"
aber wohl eher nicht face-wink; dann wäre nur zu beachten, dass im ersten Arrayelement das "01" am Anfang übergangen wird:
MeineDaten(0) = Mid(MeineDaten(0), 3)
Grüße
bastla
48507
48507 07.11.2012 aktualisiert um 15:19:12 Uhr
Goto Top
Also ich habe es jetzt so gemacht:

- Datensätze jeweils in eine Datei ausgelagert (pro Personalnummer)
- Zeilenumbrüche aus der Datei entfernt
- aus diesen Dateien eine zusammengesetzt

Ist vielleicht bescheuert, funktioniert aber face-smile (Ich hab's nicht so mit VBScript)

Weiß einer zufällig, ob man direkt beim Zusammensetzen der Variablen eine Überprüfung machen kann (Wenn "-" vorhanden, dann setzte es nach Vorne)? Oder muss ich über Zwischenvariablen gehen (bei so vielen - sehr mühsam...).

Wahrscheinlich nicht, oder? Siehe oben im Quelltext, Zeilen 7-10.
TsukiSan
TsukiSan 07.11.2012 aktualisiert um 15:34:26 Uhr
Goto Top
Hallo sputnik,

Also ich habe es jetzt so gemacht:

Wie hast du es so gemacht?

Lass uns teilhaben an deinem Tun und wir helfen.

Viele Grüsse

Tsuki