csv datei mit vba einlesen, string enthaehlt komma

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    csv datei mit vba einlesen, string enthaehlt komma

    hallo zusammen, ich denke das thema gab es sicherlich schon oft, aber die suche konnte mir nichts passendes liefern.

    Quellcode

    1. Dateipfad = "F:\history.csv"
    2. 'csv-Datei öffnen
    3. d = FreeFile
    4. Open Dateipfad For Input As #d
    5. Do While Not EOF(d)
    6. Nr = Cells(Rows.Count, 1).End(xlUp).Row + 1
    7. Line Input #d, Line
    8. arrWerte = Split(Line, ",")
    9. dateA = Mid(arrWerte(1), 1, 11)
    10. Selection = arrWerte(3)


    Bei einer Zeile (01.01.2017,17:00,"Burger, Pommes und Salat",gut) hier tritt ein logischer fehler auf.
    Statt
    01.01.2017
    17:00
    "Burger, Pommes und Salat"
    gut

    bekommt man
    01.01.2017
    17:00
    "Burger
    Pommes und Salat"
    gut

    also ist hier ein feld zuviel und das Komma in dem String wurde fälschlicherweise als seprator gesehen. Ich hoffe dass es verständlich wurde. Danke für jede HIlfe.
    Nunja, "fälschlicherweise als seperator gesehen" ist gut. Woher soll das Programm es auch besser wissen? Ich vermute mal nicht, dass die Möglkichkeit besteht, in den Rohdaten den Seperator selber zu ändern, oder? Daher fällt mir auf Anhieb nur ein, dass das entstandene Datenarray ausgewertet wird und die falsch zerpflückten Zeilen zusammengefasst werden, eben durch Wiedereinfügen von Kommata/Kommas. Dabei muss natürlich beachtet werden, dass ggf. mehr als zwei Zeilen zusammengehören und der Anfang dort ist, wo der String mit einem Anführungszeichen beginnt und bei dem Arrayelement endet, wo er mit dem Zeichen endet. Aber es scheint sich ja eh nur um einen Bereich in den Rohdaten zu handeln, der quasi falsch auseinandergerupft wird, richtig?
    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.
    Hallo metti27,
    du kannst den Seperator ändern.
    Setze mal ab Zeile 10 das ein:

    Visual Basic-Quellcode

    1. Dim Zeile$, i&, flgA As Boolean, arrWerte$()
    2. Line Input #d, Zeile
    3. flgA = False
    4. For i = 1 To Len(Zeile)
    5. Select Case Mid$(Zeile, i, 1)
    6. Case Chr$(34)
    7. flgA = Not flgA
    8. Case ","
    9. If flgA = False Then Mid$(Zeile, i, 1) = vbCr
    10. End Select
    11. Next i
    12. arrWerte = Split(Zeile, vbCr)

    Übrigens, eine Variable besser nicht Line nennen. Das
    ist ein reserviertes Basic-Wort.
    Gruss,

    Neptun
    hallo VaporiZed,
    ja klar, das Programm kann es natürlich nur falsch interpretieren, deswegen habe ich es auch einen Logikfehler genannt. Die Rohdaten kann ich selber nur im csv ändern. ich habe schon bei der Stelle nachgefagt, aber z.bB: ";" als Seperator zu verwenden ist wohl nicht möglich.


    mit Neptun's Antwort ist mir aber auch schon geholfen! Super klappt. ich verstehe zwar noch nicht ganz was da (Zeile für Zeile) passiert, aber das Ergebnis stimmt schonmal. Kleiner Schönheitsfehler noch das die beiden Anführungszeichen auch als Teil des Strings angesehen werden.

    Gruß Metti

    petaod schrieb:

    Warum machst du das von Hand und verwendest nicht Workbooks.OpenText?
    Da kannst du TextQualifier mit angeben und gut ist.

    sieht erstmal sehr mächtig und auch einfach aus, aber ist glaube ich nicht genau das was ich suche.
    Mit deinem Vorschlag wird die ganze csv Datei geladen richtig? Um bei meinem Bespiel zu blieben (01.01.2017,17:00,"Burger, Pommes und Salat",gut), soll z.B. auch nur das Datum, und Gericht in die Excel Tabelle eingefügt werden.

    Noch eine andere Frage, die aber nicht ganz zu dem Thema passt: da das ganze ja an Windows + VBA gebunden ist, suche ich auch nach einer systemunabhängigen Lösung die für Mac und Windows gleich funktioniert.
    1. Benutzer gibt Ort des csv an
    2. Benutzer drückt start
    3. Daten werden in Excel geladen
    falls nicht auch nicht schlimm.

    Danke soweit!

    metti27 schrieb:

    soll z.B. auch nur das Datum, und Gericht in die Excel Tabelle eingefügt werden.
    Die Idee ist, das CSV in einem neuen Workbook sauber zu öffnen.
    Dann kannst du von dem CSV-Workbook in dein Original-Workbook das kopieren, was du benötigst.
    Jedenfalls kann Excel mit allen möglichen CSV-Formaten umgehen und du musst das Rad nicht noch mal erfinden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --