Idee für Ausplitten gesucht - vermutlich nur mit RegEx - aber auch dann wie?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Idee für Ausplitten gesucht - vermutlich nur mit RegEx - aber auch dann wie?

    Moin!

    ich habe eine schwierige Aufgabe beim Aufsplitten einer CSV-Datei.

    Hier die Datenzeile:
    4414212.250;5975136.579;"37";;1_37;" 190";5973726;611258;APS;Acer;"Acer pseudoplatanus; Bergahorn";5.00;87.00;"1";;;Strassengrün;Zentralklärwerk;Wanderweg;"11";"28";;;;;;ZKW;;; ;


    Normalerweise wird immer an den ";" aufgetrennt und die Kennung für String ist das Anführungszeichen.

    Alles kein Problem, ja wenn da nicht diese Stelle gewesen wäre:

    Acer;"Acer pseudoplatanus; Bergahorn";5.00

    Die beiden Bezeichnungen werden durch ein ";" getrennt.

    Da ich nun aber die Spaltenindizies automatisch ermitteln will aus der Headerzeile muss auch der Index bei den Daten passen.

    Hat einer eine Idee, wie man die Datenzeile so aufsplitten kann das

    "Acer pseudoplatanus; Bergahorn"

    einen Wert nach der Auspaltung ergibt.

    Verständlich??

    gruß Jan
    Ein Consolen Demo-Programm:

    VB.NET-Quellcode

    1. Option Explicit On
    2. Option Strict On
    3. Imports System.Text.RegularExpressions
    4. Imports System.Console
    5. Module Module1
    6. Sub Main()
    7. Dim t As String, i As Integer = 1
    8. t = "4414212.250;5975136.579;""37"";;1_37;"" 190"";5973726;611258;APS;Acer;""Acer pseudoplatanus; Bergahorn"";5.00;87.00;""1"";;;Strassengrün;Zentralklärwerk;Wanderweg;""11"";""28"";;;;;;ZKW;;; ;"
    9. While t.Contains(";;")
    10. t = t.Replace(";;", "; ;")
    11. End While
    12. If t.EndsWith(";") Then t &= " "
    13. Dim rx As New Regex("[^;""]+|""([^""]*)""")
    14. Dim tr As Match = rx.Match(t)
    15. While tr.Success
    16. WriteLine("Feld " & i.ToString & ": " & tr.Value)
    17. tr = tr.NextMatch()
    18. i += 1
    19. End While
    20. Read()
    21. End Sub
    22. End Module
    Ohne Regex, kannst du an den Anführungszeichen splitten.
    In dem Array musst du dann nur jedes (2n)te Element mit ";"c splitten, um die restlichen Werte zu bekommen. Jedes (2n-1)te Element des Array ist ein String und braucht seine Anführungszeichen dann noch zurück

    VB.NET-Quellcode

    1. Dim arr1 = zeile.Split(ChrW(34))
    2. Dim lstrest As New List(Of String)
    3. For i = 0 To arr1.Length - 1
    4. If i Mod 2 = 1 Then
    5. lstrest.Add(ChrW(34) & arr1(i) & ChrW(34))
    6. Else
    7. If i = 0 Then ' Fix
    8. lstrest.AddRange(arr1(i).Substring(0, arr1(i).Length - 1).Split(";"c))
    9. ElseIf i < arr1.Length - 1 AndAlso arr1(i).Length > 1 Then
    10. lstrest.AddRange(arr1(i).Substring(1, arr1(i).Length - 2).Split(";"c))
    11. ElseIf arr1(i).Length > 1 Then
    12. lstrest.AddRange(arr1(i).Substring(1, arr1(i).Length - 1).Split(";"c))
    13. End If
    14. End If
    15. Next


    Edit: Ups, da waren noch ein paar Semikolons zuviel.

    Dieser Beitrag wurde bereits 11 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()