.csv einlesen, zerschneiden, in Array speichern und Daten aus Array in .txt schreiben

  • VBScript

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von BoostedBonobo.

    .csv einlesen, zerschneiden, in Array speichern und Daten aus Array in .txt schreiben

    Hallo @all,

    ich bin noch relativ neu in VBS und hab da ein kleines Problem mit meinem kleinen Script.
    Und zwar muss ich Daten aus einer .csv Datei auslesen, aus dem Delimiter ausschneiden und gewisse Felder dann an bestimmter Stelle in einem .txt Dokument einfügen.
    Die .csv ist in der Form
    ;Mandant;Abrechnungsnr;Vorname; Nachname;...;
    ;01;04;Tim;Mueller;...;
    ;;02;Peter;Maier;...; usw. es können also auch leere Einträge sein...

    Ich hab schon geschafft, dass die gesuchte Datei aufgerufen und zerlegt wird und danach in einer .txt Datei ausgegeben wird. Nur ist das Problem, dass immer nur die letzte Zeile eingetragen wird.

    Es wäre glaube ich besser, die Einträge in ein 2-dimensionales Array zu speichern, manche Zeilen, die unwichtige Einträge haben, zu ignorieren und dann von dort aus die Felder mit mArray(3, 5) an der Stelle Zeile 3, Spalte 5 auszulesen. Nur scheiter ich bisher dran, das Speichern des Arrays über 2 For Schleifen hinzukriegen.

    Könnte mir da jemand freundlicherweise helfen?

    Vielen Dank schon mal im Voraus.

    Grüße

    P.s.: mein bisheriger Code:

    Option Explicit

    Dim FSO, oFile, wholeLine, mArray, i
    Const ForReading = 1
    Const ForWriting = 2
    Const ForAppending = 8

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set oFile = FSO.OpenTextFile("C:\Users\...\Test.csv", ForReading)

    Do until oFile.AtEndOfStream
    wholeLine = oFile.ReadLine
    mArray = Split (wholeLine, ";")
    loop
    'hier wird jedes einzele Feld durchgegangen, wenn ich es in einer msgbox ausgebe
    'denke also, dass am besten dort die For-Schleife aufgehoben ist und mit UBound die Array-Grenzen deklariere
    Set oFile = FSO.OpenTextFile("C:\Users\...\Test.txt", ForWriting, true)

    hier wird Zeile für Zeile eingetragen mit oFile.WriteLine

    oFile.Close
    Und warum öffnest Du die Ausgabedatei nicht vor der Do-Loop-Schleife und packst einfach den WriteLine-Befehl in die Do-Loop-Schleife mit rein? Dann kommen doch alle aktuell gesplitteten Daten in der Txt-File an - wie gewünscht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke dir für den Tipp! Jetzt schreibt er auch alles in die .txt Datei und streicht die ";". Nur schreibt er alles hintereinander, wie kann ich das besser sortieren?

    mArray(7) bedeutet ja schon, dass da alle Einträge aus Spalte 7 sind? Wenn ich die via msgbox ausgeben lasse, werden alle Einträge nacheinander angezeigt...
    Wie könnte ich da die erste Ziele für die Überschrift und zum Beispiel die 5 Zeile für den jeweiligen Eintrag auslesen und die dann in die .txt schreiben?
    Da blick ich nicht mehr durch. "Ein Wort sagt mehr als tausend Bilder." Zeig doch z.B. mal anhand der Beispieldaten, die in Post#1 zu lesen sind, was Du genau haben willst.

    BoostedBonobo schrieb:

    wie kann ich das besser sortieren?

    Was willst Du denn da z.B. wie sortiert haben?

    BoostedBonobo schrieb:

    Wenn ich die via msgbox ausgeben lasse, werden alle Einträge nacheinander angezeigt...

    Wo baust Du die MsgBox mit welchem Code ein? MsgBox mArray(7)?

    BoostedBonobo schrieb:

    Wie könnte ich da die erste Ziele für die Überschrift und zum Beispiel die 5 Zeile für den jeweiligen Eintrag auslesen

    => "Wie könnte ich da die erste Ziele Zeile für die Überschrift verwenden(?) und zum Beispiel die 5 Zeile 5. Spalte(?) für den jeweiligen Eintrag auslesen" => bitte anhand eines konkreten Beispiels zeigen, was Du gern hättest, da der Satz selbst nach vermuteter Korrektur inhaltlich unklar ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nach mehrmaligem lesen meines Textes fällt mir auch auf, dass das nicht gut formuliert ist! :D sorry dafür...

    Die .csv ist so aufgebaut: in der ersten zeile stehen die köpfe, wie name, Geburtsdatum, Wohnort usw.
    Darunter stehen dann die Einträge.

    ;nname;vname;anrede;Geburtsdatum;Geburtsort; usw.
    ;mueller;peter;herr;01.01.1990;Ulm;
    ;maier;petra;frau;02.02.1990;;
    Usw.

    Und ich brauch in meiner Ausgabe:
    Nname = mueller
    Anrede = herr
    Geburtsdatum = 01.01.1990
    Nname = maier
    Anrede = frau
    Geburtsdatum = 02.02.1990

    Also soll aus der .csv einträge aus der ersten zeile spalte 1 einem eintrag aus der gleichen spalte nur in ner anderen zeile zugeordnet werden und die dann untereinander in einer .txt ausgeben. Es gibt auch zeilen- und spalteneinträge die leer und/oder nicht von belang sind, die werden übergangen.

    Ich hoffe, das ist jetzt verständlicher... :)

    P.s.: zur msgbox... msgbox mArray(7) war der Befehl. Da wurde nach und nach die Einträge aus der 8 Spalte ausgegeben...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BoostedBonobo“ ()

    Dann also vor Deiner Do-Loop-Schleife erstmal ein

    Visual Basic-Quellcode

    1. wholeLine = oFile.ReadLine
    2. CategoryDescriptionArray = Split (wholeLine, ";")

    dann hast Du erstmal in jener neuen Variable Deine Überschriften beieinander.
    Und dann eben eine For-Schleife bei jeder Datenzeile mit i von 1 bis wasauchimmer und dann eben
    oFile1.WriteLine(CategoryDescriptionArray(i) & " = " & mArray(i))
    Was Du dann noch rausfilterst, bleibt Dir überlassen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wow! Da wäre ich ja nie drauf gekommen 8|

    Danke, auch dafür, dass du dir die Zeit nimmst zu helfen! :)
    Gleich mal ausprobieren...

    Wie deklarierst du eigentlich dann das mArray?

    Bei nem testlauf erstellt er dann eine riesen .txt Datei (bei 800mb hab ich den Prozess abgebrochen). Woran kann das liegen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BoostedBonobo“ ()

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim FSO, oFile, txtFile, wholeLine, mArray
    3. Const ForReading = 1
    4. Const ForWriting = 2
    5. Set FSO = CreateObject("Scripting.FileSystemObject")
    6. Set oFile = FSO.OpenTextFile("C:\Users\...\Test.csv", ForReading)
    7. Set txtFile = FSO.OpenTextFile("C:\Users\...\Test.txt", ForWriting, true)
    8. oFile.SkipLine()
    9. Do Until oFile.AtEndOfStream
    10.     wholeLine = oFile.ReadLine
    11.     mArray = Split (wholeLine, ";")
    12.     TxtFile.WriteLine("Nname = " & mArray(1))
    13.     TxtFile.WriteLine("Anrede = " & mArray(3))
    14.     TxtFile.WriteLine("Geburtsdatum = " & mArray(4))
    15. Loop
    16. oFile.Close 
    17. txtFile.Close
    Das funktioniert hervorragend. Danke :)

    Nur stehen jetzt in den ersten 3 durchgängen nur blödsinn da, weil in der .csv da irgendwelcher nonsens drinstand, ehe es zu den daten ging. Welche Parameter kann ich da in ner for-schleife angeben, weil bei i=3 to 8 zum Beispiel kommt immer ein fehler...?

    BoostedBonobo schrieb:

    Bei nem testlauf erstellt er dann eine riesen .txt Datei (bei 800mb hab ich den Prozess abgebrochen). Woran kann das liegen?

    Entsprechen denn die Zieldaten den Quelldaten oder gibt es zig Wiederholungen? Wie groß ist denn die Quell-CSV-Datei? Kannst/darfst Du nen Auszug einer Quell-CSV-Datei hier posten, ohne gleich den Datenschutz damit zu verhöhnen?

    Die Lösung von Eierlein mit .Skipline setzt voraus, dass die "Überschriften" immer fest sind. Musst da natürlich entscheiden, ob das für Dich passt.

    "In den ersten 3 Durchgängen" - meinst Du damit die ersten drei erwarteten Datenzeilen? Wir müssen natürlich davon ausgehen, dass Deine Beispieldaten repräsentativ sind. Dass da Mus drinstehen kann, ist neu. Was steht denn da z.B.?

    BoostedBonobo schrieb:

    Welche Parameter kann ich da in ner for-schleife angeben, weil bei i=3 to 8 zum Beispiel kommt immer ein fehler...?

    Parameter für ne For-Schleife? Nun, Du kannst versuchen, den mArray-Eintrag auf Sinnhaftigkeit auszuwerten und ggf. ein paar i zu überspringen. Doch da stellt sich die Zusatzfrage: Weißt Du wie das Filtern (Stichwort "If") und das Überspringen von i geht?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Statt auf [Antwort] eben auf [Erweiterte Antwort] -> [Dateianhänge] (ist unter der Textbox zu finden)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wenn Du darfst, wär's besser. Dann könnten wir am "lebenden Objekt" arbeiten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    .csv Datei Aufbau:
    Feldid;pdman;pdak;pdnr;;;;pdnaname;pdvoname;pdnamevo;pdanrede;pdtitel;.... (hier nimmt man die Deklaration raus)
    Maske;;;;;;pstpers;[...];pstpers;pstbanki (teils unwichtig)
    Tabelle;;;;;;;pgrdat;... (unwichtig)
    ;mandant;abrechnungskreis,personalnr;;;;nachname;...
    ;01;04;12345678;...;müller;... (ab da kommt pro zeile der inhalt)

    Ausgabedatei:
    Mask = “pstpers“;
    Pdman = “01“;
    Pdak = “04“;
    Usw.
    Hmm ... ok, Zeile 1 sind dann also die Sachen, die bei mir in CategoryDescriptionArray aus Post#6 reinkommen.
    Dann die nächste Zeile: "Maske;;;;;;pstpers;[...];pstpers;pstbank" - hast Du Dich da bei der Ausgabedatei verschrieben? Da dort steht: "Mask = “pstpers“;". Wenn ja, dann muss also auch die 2. Zeile seperat wie die 1. Zeile ausgelesen werden.
    Die 3. Zeile kann dann wohl mit Eierleins oFile.SkipLine() übersprungen werden.
    Die 4. Zeile: Keine Ahnung, ob Du da die Bezeichnungen wiederum brauchst. In den vorherigen Posts klang das so, als ob Du die benötigst. Falls ja: seperate Behandlung wie Zeile 1, sonst: SkipLine().
    Ab Zeile 5 Schleifenabarbeitung wie in den vorherigen Posts.

    Anders: Wie weit bist Du mit welchem Code gekommen und an welchen Punkten hängst Du noch fest?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Option Explicit

    Dim FSO, oFile, wholeLine, mArray, i, nFile
    Const ForReading = 1
    Const ForWriting = 2
    Const ForAppending = 8

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set oFile = FSO.OpenTextFile("C:\Users\steff_001\Desktop\Neuer Ordner\Personendaten_Input.csv", ForReading)
    Set nFile = FSO.OpenTextFile("C:\Users\steff_001\Desktop\Neuer Ordner\Test.txt", ForWriting, true)
    oFile.Skipline()

    Do until oFile.AtEndOfStream
    wholeLine = oFile.ReadLine
    mArray = Split (wholeLine, ";")
    nFile.Write "Maske = " + mArray(0) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDMAN = " + mArray(1) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDAK = " + mArray(2) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDPNR = " + mArray(3) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDNANAME = " + mArray(7) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDVONAME = " + mArray(8) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDANREDE = " + mArray(10) + ";" '(1=Herr, 2=Dame)
    nFile.WriteBlanklines(1)
    nFile.Write "MDKONZEI = " + mArray(12) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDGESCHL = " + mArray(13) + ";" '(M=männlich, F=weiblich)
    nFile.WriteBlanklines(1)
    nFile.Write "PDSTAAT = " + mArray(14) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDSTR = " + mArray(15) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDPLZ = " + mArray(16) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDORT = " + mArray(17) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "MDFAMSTD = " + mArray(20) + ";" '(L=ledig, V=verheiratet, G=Geschieden)
    nFile.WriteBlanklines(1)
    nFile.Write "PDGEBDAT = " + mArray(21) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDTELGES = " + mArray(26) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDTELPRV = " + mArray(27) + ";"
    nFile.WriteBlanklines(1)
    nFile.Write "PDFAX = " + mArray(28) + ";"
    nFile.WriteBlanklines(1)

    loop
    oFile.Close
    nFile.Close

    Bekomm das jetzt nicht mehr mit dem CategoryDescriptionArray hin, da gibts dauernd nen Indexfehler aus...
    Wie verpack ich das oFile.Skipline() mit rein, dass er genau die rauslässt?

    Irgendwie ist die Maske immer dieselbe, brauch ich also nur einmal auslesen...
    Zeile 3 und 4 kann man weglassen...

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „BoostedBonobo“ ()

    Es fehlten nur ein paar SkipLines zum Anfang, die korrekte DatenSortierung, bei Tel. privat und geschäftlich waren die Feldindizes vertauscht und bei GUELTIG_AB musste ich raten und hab einfach den Wert von "im Konzern seit" verwendet. Sollte noch was unklar sein, gehe ich mal mit folgenden Code davon aus, dass der Rest von allein zu bewerkstelligen ist, richtig? ;)
    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Option Explicit
    2. Dim FSO, oFile, wholeLine, mArray, i, nFile
    3. Const ForReading = 1
    4. Const ForWriting = 2
    5. Set FSO = CreateObject("Scripting.FileSystemObject")
    6. Set oFile = FSO.OpenTextFile("C:\Users\steff001\Desktop\Neuer Ordner\Personendaten_Input_Eingabe.csv", ForReading)
    7. Set nFile = FSO.OpenTextFile("C:\Users\steff001\Desktop\Neuer Ordner\Test.txt", ForWriting, true)
    8. oFile.Skipline()
    9. oFile.Skipline()
    10. oFile.Skipline()
    11. oFile.Skipline()
    12. Do until oFile.AtEndOfStream
    13. wholeLine = oFile.ReadLine
    14. mArray = Split (wholeLine, ";")
    15. nFile.WriteLine("MASK = ""PSTPERS"";")
    16. nFile.WriteLine("PDMAN = """ + mArray(1) + """;")
    17. nFile.WriteLine("PDAK = """ + mArray(2) + """;")
    18. nFile.WriteLine("PDPNR = """ + mArray(6) + """;")
    19. nFile.WriteLine("PDNANAME = """ + mArray(7) + """;")
    20. nFile.WriteLine("PDVONAME = """ + mArray(8) + """;")
    21. nFile.WriteLine("PDSTR = """ + mArray(15) + """;")
    22. nFile.WriteLine("PDPLZ = """ + mArray(16) + """;")
    23. nFile.WriteLine("PDORT = """ + mArray(17) + """;")
    24. nFile.WriteLine("MDKONZEI = """ + mArray(12) + """;")
    25. nFile.WriteLine("PDGESCHL = """ + mArray(13) + """;")
    26. nFile.WriteLine("PDGEBDAT = """ + mArray(21) + """;")
    27. nFile.WriteLine("PDSTAAT = """ + mArray(14) + """;")
    28. nFile.WriteLine("MDFAMSTD = """ + mArray(20) + """;")
    29. nFile.WriteLine("PDTELPRV = """ + mArray(26) + """;")
    30. nFile.WriteLine("PDTELGES = """ + mArray(27) + """;")
    31. nFile.WriteLine("PDFAX = """ + mArray(28) + """;")
    32. nFile.WriteLine("PDANREDE = """ + mArray(10) + """;")
    33. nFile.WriteLine("GUELTIG_AB = """ + mArray(12) + """;")
    34. nFile.WriteLine("ENTER;")
    35. loop
    36. oFile.Close
    37. nFile.Close


    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.