CSV einlesen

  • VB.NET

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

    CSV einlesen

    Guten Tag liebe Freunde der Nacht :)

    Ich habe ein kleines Problem beim einlesen einer CSV-File. Und zwar kann es vorkommen, dass die CSV-Files, welche ich geschickt bekomme, unter anderem Buchstaben von anderen Sprachen enthalten beispielsweise aus dem Ungarischen den Buchstaben "Ő". Dieser wird mir allerdings in der CSV mit dem numerischen Wert "#337;" gespeichert. Wenn ich nun die CSV einlesen und mit dem Seperator ";" unterteilen möchte splittet mir mein Code auch nach wie oben genannten Zeichenketten.
    Sprich -> In dem Feld steht komplett "Pet&_#337;fi" (ohne _ )
    Nach der Bearbeitung durch meinen Code wird aus dem einen Feld -> zwei Felder "Pet&#337" und "fi".

    Momentan lese ich die CSV mit einem StreamReader ein und trenne per Split-Funktion

    VB.NET-Quellcode

    1. Dim strDaten As String() = strLine.Split(cSeperator, 16)

    cSeperator wird aus einer Datenbank gelesen und der Funktion übergeben (";")

    Kennt ihr dazu eine mögliche Lösung? Ich habe bereits versucht iwie mit RegEx daran rum zu wursteln, das wollte aber dann nicht so wie ich :S

    UPDATE:

    Das Encodierung des StreamReaders ist auf Standard gestellt bei UTF-8 bzw ASCII gibt er Umlaute wie ä,ö,ü fehlerhaft zurück
    komischerweise ignoriert die Split-Funktion nicht die Semikolons in einem als Text gekennzeichnetem Wert :S

    Mit freundlichen Grüßen
    ChrizzleWhizzle

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ChrizzleWhizzle“ ()

    Danke für die schnelle Hilfe :)

    Ich bin auf den TextFieldParser ausgewichen und das auslesen hat schonmal ohne Probleme geklappt. Jetzt nur noch die Funktion umschreiben damit das ganze korrekt importiert wird und alle sind wieder happy ;D

    Mit freundlichen Grüßen
    ChrizzleWhizzle
    Neues Problem :S

    Trennzeichen ist das Semikolon ";" allerdings steht in einem Feld einer neuen Datei, der Wert

    Quellcode

    1. ""der arbeitsmarkt" "


    Nun schmeißt er eine Exception

    "Die Zeile 6 kann mit den aktuellen Trennzeichen nicht analysiert werden"

    Die komplette Zeile

    Quellcode

    1. 7267; 2;19052011;"uy07267A";"FAU Zürich ";""der arbeitsmarkt" ";" Herrn Robert Hansen ";"Kernstrasse 57 ";" CH 8004 Zürich ";"redaktion@derarbeitsmarkt.ch ";"R";"2";"0442951125 ";" ";" ";"15"


    Hat jmd eine Idee wie ich das lösen könnte?
    Mein Vorgesetzter meinte ich solle "schnell" einen Algorithmus dafür schreiben, allerdings fehlt mir dazu das nötige "Kleingedruckte" :|
    Ich würde die Daten zeilenweise einlesen und Zeile für Zeile die Feldlänge nach dem Splitten prüfen.
    Stimmt die Feldlänge, dann ist alles OK. Stimmt sie nicht, dann kannst Du sie z.B. in eine separate Datei aussortieren. Die aussortierte Datensätze entweder manuelle korrigieren und nochmal einlesen, oder falls bestimmtes Fehler-Muster erkennbar, die automatische Korrektur direkt beim Einlesen vornehmen.

    VB.NET-Quellcode

    1. Dim expectedColumns As Integer = 5
    2. Dim filename As String = "path\to\file.ext"
    3. For Each line As String In IO.File.ReadAllLines(filename)
    4. Dim columns() As String = line.Split(";"c)
    5. Select Case columns.Length
    6. Case Is < expectedColumns
    7. ' Falsche Feld-Länge -> weniger als erwartet
    8. ' -> Untersuchen, Meldung ausgeben, Datensatz für nachträgliche Korrektur aussortieren, etc.
    9. Case Is > expectedColumns
    10. ' Falsche Feld-Länge -> größer als erwartet
    11. ' Wahrscheinlich durch zusätzliche Semicolons von der Kodierung der fremdsprachlichen Zeichen
    12. ' Weitere automatische Korrektur oder Aussteuerung zur manuellen Korrektur
    13. Case Else
    14. ' Richtige Feldlänge
    15. ' -> Daten weiter verarbeiten
    16. End Select
    17. Next

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

    - Die Feldlänge ist variabel
    - Mit der Split-Funktion trennt er bei jedem Vorkommen des Trennzeichen, auch wenn es in einem String in einem Feld steht
    - und es können generell Sonderzeichen in einem Feld vorkommen Bsp " oder ;
    Momentan werden alle Semikolons innerhalb von Anführungszeichen ignoriert und das soll auch so bleiben
    Nur ist nun eben das problem mit den eventuell vorkommenden Anführungzeichen innerhalb eines Feldes

    Edit:
    Wenn du mit Feldlänge -> die Feldanzahl gemeint hast... diese ist schon fest aber er schmeißt halt ne Exception bei doppelten " damit kommt er anscheinend nicht so ganz klar
    Wennich Wikipedia richtig verstehe, ist die Fehler-Datei ein Datenfehler, für den du nicht verantwortlich gemacht werden kannst.

    Ich halte es für recht fragwürdig, da jetzt einen SpezialParser zu schreiben, der dann eiglich nicht mehr CSV unterstützt - stattdessen sollte der Daten-Ersteller sich an die Format-Spezifikation halten.
    Langfristig tut man selbst dem Daten-Ersteller da auch keinen Gefallen mit.