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-Key: 193804

Url: https://administrator.de/contentid/193804

Printed on: April 23, 2024 at 21:04 o'clock

Member: andimue
andimue Nov 06, 2012 at 12:02:36 (UTC)
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?
Mitglied: 48507
48507 Nov 06, 2012 updated at 12:27:10 (UTC)
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.
Member: TsukiSan
TsukiSan Nov 06, 2012 updated at 12:26:13 (UTC)
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
Mitglied: 48507
48507 Nov 06, 2012 at 12:28:46 (UTC)
Goto Top
Definiert ist es in der "Beschreibung". Bsp: Feld1: Länge 2, von 1 bis 2. Die Beschreibung ist aber nicht das Problem...
Member: TsukiSan
TsukiSan Nov 06, 2012 updated at 12:34:34 (UTC)
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
Mitglied: 48507
48507 Nov 06, 2012 updated at 12:40:02 (UTC)
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().
Member: TsukiSan
TsukiSan Nov 06, 2012 at 13:08:34 (UTC)
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
Mitglied: 48507
48507 Nov 06, 2012 at 13:17:49 (UTC)
Goto Top
01 kann aber auch in den Daten stehen, z.B. in Datumsangaben. Trotzdem danke face-smile
Member: TsukiSan
TsukiSan Nov 06, 2012 at 13:35:45 (UTC)
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
Member: pieh-ejdsch
pieh-ejdsch Nov 06, 2012 at 14:11:12 (UTC)
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
Member: bastla
bastla Nov 06, 2012 updated at 14:22:43 (UTC)
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
Mitglied: 48507
48507 Nov 07, 2012 updated at 14:19:12 (UTC)
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.
Member: TsukiSan
TsukiSan Nov 07, 2012 updated at 14:34:26 (UTC)
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