Zeilen aus Text Datei und Deklarieren wenn Headersatz oder normaler satz

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Zeilen aus Text Datei und Deklarieren wenn Headersatz oder normaler satz

    Hallo zusammen,

    ich sehe wieder einmal vor einem Problem und stehe wohl auf dem Schlauch wie ich etwas lösen kann.

    Ich habe eine Text Datei mit ca. folgendem Inhalt.


    event_id,ecm_id,event_name,created_at,schema_version,edoc_document_id
    60d16f7b36e3c703237fe7d7,E000040323,post,2021-06-22T05:04:59,4,c4cbfe20-d036-11eb-a01a-0583e7cccfa5
    60d16f7b36e3c703237fe7d7,E000040323,post,2021-06-22T05:04:59,4,c4cbfe20-d036-11eb-a01a-0583e7cccfa5
    60d16f7b36e3c703237fe7d7,E000040323,post,2021-06-22T05:04:59,4,c4cbfe20-d036-11eb-a01a-0583e7cccfa5
    event_id,ecm_id,event_name,created_at,schema_version,edoc_document_id
    60d16f7b36e3c703237fe7d7,E000040323,post,2021-06-22T05:04:59,4,c4cbfe20-d036-11eb-a01a-0583e7cccfa5

    Jetzt habe ich die Überschrift und darunter der erste Satz ist der Header satz.
    Wenn das auslesen der Datei an diesem Header Satz ist, soll eine Variable als "Head" gesetzt werden.
    Sollte aber der Satz keine Überschrift haben, also hier im Fall Zeile 3 und 4, dann soll die gleiche Variable als "Satz" gesetzt werden.

    Ich hoffe Ihr könnt mir auf die Sprünge helfen wie ich das umsetzten kann.

    Danke und Gruss
    Thomas
    Hallo Erfinder

    ja gerne, werde aber alles unnötige entfernen.
    Wichtig, ich definiere Positionen wo jedes einzelne Feld nachher geschrieben werden soll.
    Auch funktioniert alles.

    Ich überspringe auch die ersten beiden Zeilen.


    VB.NET-Quellcode

    1. Public Sub ReadandWriteCSV()
    2. Dim s1 As Stopwatch = Stopwatch.StartNew
    3. Dim finfo As New IO.DirectoryInfo(Loadpath)
    4. For Each fi In finfo.GetFiles(strTyp)
    5. Using sr As New TextFieldParser(fi.FullName)
    6. With sr
    7. .SetDelimiters(Delimiters)
    8. .HasFieldsEnclosedInQuotes = False
    9. Dim Position() As Integer = {1, BuchungsdatumPosition, BuchungsartPosition, BuchungsidentPosition, BelegnummerPosition, BelegdatumPosition, EinkaufPosition, BuchungsbetragPosition, SteuerschlüsselPosition, WährungPosition, BuchungstextPosition, KostenartPosition, KSTKTRPosition, ZahlungskonditionPosition}
    10. Dim rows() As String = IO.File.ReadAllLines(fi.FullName)
    11. For i As Integer = 2 To rows.Count - 1
    12. Dim cols() As String = rows(i).Split(Delimiters)
    13. Dim FieldData() As String
    14. Do While Not .EndOfData()
    15. FieldData = .ReadFields()
    16. Dim csvFile() As String = fi.Name.Split(CChar(leseendung))
    17. Dim sw As System.IO.StreamWriter
    18. sw = FileSystem.OpenTextFileWriter(Savepath & csvFile(0) & schreibendung, True)
    19. Buchungsdatum = Buchungsdatum.Replace("-", "")
    20. Buchungsdatum = Buchungsdatum.Substring(2)
    21. Dim MyString As String = String.Empty
    22. Dim Xarray() As String = {Posi1, Buchungsdatum, Buchungsart, Buchungsident, Belegnummer, Belegdatum, EK, Buchungsbetrag, Steuerschlüssel, WährungPosition, Buchungstext, Kostenart, KSTKTR, Zahlungskondition}
    23. For ii As Integer = 0 To Xarray.GetUpperBound(0)
    24. MyString = MyString.PadRight(Position(ii) - 1) & Xarray(ii)
    25. Next
    26. sw.WriteLine(MyString)
    27. sw.Close()
    28. Loop
    29. Next
    30. End With
    31. End Using
    32. Next
    33. s1.Stop()
    34. End Sub
    @tweber Iteriere duirch alle Zeilen durch.
    Erkenne, was ein Header ist, erkenne, was sonst was ist, und reagiere entsprechend:

    VB.NET-Quellcode

    1. For Each line In System.IO.File.ReadLines(PFAD_ZU_DEINER_DATEI)
    2. If line.Contains("HEADER_KENNUNG") Then
    3. ' was tun
    4. ElseIf line.Contains("SUB_HEADER_KENNUNG") Then
    5. ' was tun
    6. Else
    7. ' was tun
    8. End If
    9. Next
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ja so war der Plan, nur leider kann ich wirklich laut Inhalt keinen Unterschied vom Header satz oder der darauf folgenden finden.

    Das ist der Kopf
    event_id,ecm_id,event_name,created_at,schema_version,edoc_document_id
    Das wäre der Headersatz da nach der Überschrift
    60d16f7b36e3c703237fe7d7,E000040323,post,2021-06-22T05:04:59,4,c4cbfe20-d036-11eb-a01a-0583e7cccfa5
    Das wäre der normale Satz da über dem satz keine Überschrift ist.
    60d16f7b36e3c703237fe7d7,E000040323,post,2021-06-22T05:04:59,4,c4cbfe20-d036-11eb-a01a-0583e7cccfa5

    Hier weiss ich leider nicht weiter.
    Gruss
    Thomas

    tweber schrieb:

    keinen Unterschied vom Header satz oder der darauf folgenden
    Vielleicht ist es einfach nur die nächste Zeile, aber das musst Du bei Dir klären.
    Also: Eine Zeile, die mit "event_id" beginnt, ist ein Kopf.
    Die darauf folgende Zeile ist ein Headersatz,
    die darauf folgende Zeile ist ein normaler Satz.
    Du musst also beim Lesen mitzählen, um zu wissen, was die letzte Zeile für eine war.
    Hierzu bietet sich ein Enum an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Im gezeigten Code läuft etwas total schief - Auszüge:

    VB.NET-Quellcode

    1. '...
    2. Using sr As New TextFieldParser(fi.FullName)
    3. With sr
    4. '...
    5. Dim rows() As String = IO.File.ReadAllLines(fi.FullName)
    6. For i As Integer = 2 To rows.Count - 1
    7. '...
    8. Do While Not .EndOfData()
    9. '...
    10. Loop
    11. Next
    12. End With
    13. End Using
    in #2 erzeugst du einen TextFieldParser, also ein Dingens zum csv auslesen.
    in #5 liest du aber dieselbe Datei(!!) mit File.ReadAllLines() ein.
    anschliessend gehst du alle lines - bei dir heissen sie rows - durch, und für jede row läufst du - in #8 - nochmal mit dem TextfieldParser bis zum Ende der Datei.

    Also das ist Kuddelmuddel, das sollteste bereinigen.
    Entweder du liest die Datei mittm TextfieldParser (tät ich empfehlen), oder mit File.ReadAllLines() - aber nicht beides.

    Dann nochma posten

    Ich würde auch empfehlen, den With-Block wegzumachen, und den TFP - bei dir heisster sr - stattdessen jeweils explizit zu anzusprechen.
    Hallo Erfinder,

    das hatte ich gemacht da ich zwar nur mit dem Textfieldparser einlese.
    Dann hatte ich eine möglichkeit gesucht die ersten beiden Zeilen Dauerhaft zu überspringen.

    ReadAllLines ist die möglichkeit bei mir die ersten beiden Zeilen dauerhaft zu Überspringen.
    Leider hatte ich mit dem Textfieldparser keine möglichkeit gefunden dies zu machen.

    Ich werde es mal Überarbeiten und nach einer möglichkeit suchen die beiden Zeilen zu überspringen.

    Danke und Gruss

    Thomas