VBA - unterschiedliche Trennung bei ; und , CSV

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter_P.

    VBA - unterschiedliche Trennung bei ; und , CSV

    Hallo zusammen,

    ich habe ein Problem mit meinem Macro in Excel.

    So sieht meine CSV Datei aus:
    Name,Strasse,Hausnummer, PLZ,Ort
    Peter,Marienstr.,12,50825,Köln
    Martin,Koserstr.,55,14195,Berlin

    ...und das ist der Code (MyFile beinhaltet den Pfad zur CSV Datei):

    Visual Basic-Quellcode

    1. Open MyFile For Input As #1
    2. Do Until EOF(1)
    3. Line Input #1, MyContent


    Wenn ich in der AWS Cloud Informationen in eine Semikolon separierte CSV Datei exportiere und diese mit dem Code einlese, dann klappt alles wunderbar, bei jedem Durchlauf wird immer nur eine Zeile der CSV Datei in MyContent eingelesen.
    Durchlauf 1 --> Name,Strasse,Hausnummer, PLZ,Ort
    Durchlauf 2 --> Peter,Marienstr.,12,50825,Köln
    usw.

    Exportiere ich aber den gleichen Inhalt in eine Komma separierte CSV Datei exportiere und lese diese mit dem gleichen Code ein, dann ist bei dem ersten Durchlauf gleich der gesamte CSV Inhalt in MyContent drin.
    Durchlauf 1 --> Name,Strasse,Hausnummer, PLZ,OrtPeter,Marienstr.,12,50825,KölnMartin,Koserstr.,55,14195,Berlin

    Weiß jemand, was ich falsch mache? Es ist doch nur das Trennzeichen anders, alles andere identisch.
    Vielen Dank.

    Gruß
    Peter

    *Roten Text durch Code-Tag ersetzt*

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Wenn ich den "regulären Weg" zum exportieren als CSV (Kommasepariert) nehme, bekomme ich 0D0A in der Exportdatei im Hexeditor zu sehen, also Carriage Return & Linefeed wie unter Windows üblich.
    Scheint ja so, wie @petaod schon anmerkt, eine abweichender oder gar kein(?) Lineseparator verwendet uz werden, also wäre es nötig zu wissen, wie genau die Datei erzeugt wird, den Code wenn es welchen gibt hier posten.
    Versuch mal, über das FileSystemObject einzulesem, so wie in diesem Beispiel:
    docs.microsoft.com/de-de/offic…lp/atendofstream-property

    Visual Basic-Quellcode

    1. Dim fs, a, retstring
    2. Set fs = CreateObject("Scripting.FileSystemObject")
    3. Set a = fs.OpenTextFile("c:\testfile.txt", 1, False)
    4. Do While a.AtEndOfStream <> True
    5. retstring = a.ReadLine
    6. ...
    7. Loop
    8. a.Close
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Oh, das ging ja schnell, vielen Dank :)
    Wenn ein Line-Separator am Ende einer jeder Zeile fehlt, dann wäre das schon eine logische Erklärung, danke für den Tipp. Wie könnte ich denn einen nachträglich einpflegen?

    Habe hier auf der Arbeit eben mal kurz die CSV Dateien mit dem Hexeditor überprüft. Bei Semikolon ist ein "OD OA" am ende einer jeder Zeile, bei Komma ist nur ein "OA". Mein Code überprüft zunächst, ob es sich um eine Komma oder Semikolon separierte CSV handelt. Wenn eine Komma CSV erkannt wird, dann ersetze ich die Kommas gegen Semikolons, um dann zu der weiterverarbeitenden Funktion zu springen. Könnte ich in diesem Zug dann nicht einfach den Line-Separator nachpflegen?

    Ich werde das später nach Feierabend alles andere überprüfen.
    Besten Dank.

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

    Ich würde erstmal alles einlesen und in eine einzige Variable packen. Dann erst Chr$(13) & Chr$(10), dann Chr$(10) und anschließend Chr$(13) durch ein Trennzeichen deiner Wahl ersetzen. So unterstützt man alle möglichen Zeilenumbruchsarten. Anschließend mittels Split die Variable an deinem neuen Trennzeichen aufsplitten. Dann hast du ein Array mit dein einzelnen Wertezeilen und kannst damit weiterarbeiten.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hallo,

    eure Lösungen haben mir sehr gut weitergeholfen, vielen herzlichen Dank. Ich habe die Kommas durch Semikolons ersetzt und Chr$(10) durch Chr$(13) & Chr$(10).
    Jetzt habe ich allerdings noch das Problem, welches ganz zu Anfang beim einlesen der Datei passiert... siehe Code Schnipsel ganz oben in der Beschreibung.

    Unter 1 wird die Datei geöffnet
    Unter 2 wird festgelegt, dass die Zeilen solange eingelesen werden sollen, bis EOF
    Unter 3 wird dann die erste Zeile in MyContent eingelesen

    Das passiert, wenn eine CSV Datei mit Line-Separatoren eingelesen wird. Bei mir fehlen allerdings die CR, also Chr$(13), daher wird der gesamte Content anstelle der ersten Zeile in MyContent eingelesen.
    Jetzt könnte ich es mir umständlich machen, indem ich den Inhalt von MyContent splitte durch "Chr$(13) & Chr$(10)" und irgendwo ablege und mir dann die einzelnen Zeilen vornehme und splitte durch Semikolon.
    Aber geht es nicht einfacher, indem ich in meinem Code zwischen der 1 und 2 Zeile eingreife und bereits da die Line-Separatoren einpflege, damit Zeilenweise eingelesen wird?

    So in etwa habe ich es mit vorgestellt, aber es funktioniert so leider nicht :(

    Visual Basic-Quellcode

    1. Open MyFile For Input As #1
    2. If Not InStr(#1, Chr$(13) & Chr$(10)) Then
    3. #1 = Replace(#1, Chr$(10), Chr$(13) & Chr$(10))
    4. End If
    5. Do Until EOF(1)
    6. Line Input #1, MyContent


    Besten Dank.

    die Farbe Rot ist der Moderation vorbehalten und wurde ersetzt ~VaporiZed

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

    Oder einfach, wie von petaod vorgeschlagen, das FileSystemObject verwenden. (Kann Cr und CrLf)

    Visual Basic-Quellcode

    1. Sub test()
    2. Dim fs As Object, Datei As Object
    3. Dim MyFile As String, MyContent As String
    4. MyFile = "d:\#0\test.csv"
    5. Set fs = CreateObject("Scripting.FileSystemObject")
    6. Set Datei = fs.OpenTextFile(MyFile, 1, False)
    7. Do Until Datei.AtEndOfStream
    8. MyContent = Datei.ReadLine
    9. '...
    10. 'Hier evtl. "," durch ";" ersetzen
    11. Debug.Print MyContent
    12. Loop
    13. Datei.Close
    14. End Sub

    petaod schrieb:

    Weil 0A hast du in allen Varianten drin.

    Ganz streng genommen nicht, laut Wikipedia haben das Mac OS Classic, Apple II und C64 nicht. Allerdings ist selbst ersteres von Ende 2001 und daher vmtl. nicht mehr relevant. Aber der Vollständigkeit halber sollte es erwähnt werden.

    @Peter_P Ist das #1 aus Post #8 in in den Zeilen 3 und 4 nur Pseudocode zur Veranschaulichung oder wolltest du das tatsächlich so machen? #1 ist keine Variable, mit der man irgendwas machen kann. Du musst schon erst alles einlesen und kannst erst dann den String bearbeiten.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Hallo zusammen,

    @Marcus Gräfe Tatsächlich verwende ich den Code im Post #1. Gerne hätte ich jedoch den Content schon beim einlesen in die Variable oder schon zuvor bearbeitet und habe daher den Code im Post #8 erstellt in der Hoffnung, dass es klappt. Leider war das nicht der Fall. Demnach habe ich gehofft, dass jemand von Euch "Profis" mir einen Tipp geben kann, wie ich das bewerkstelligen kann, weil ich mit VBA noch nicht so vertraut bin.

    Das hat sich aber erledigt, weil der Code von Petaod/Eierlein bestens funktioniert.
    Daher möchte ich mich an dieser Stelle bei allen, die mir hierbei geholfen haben, recht herzlich bedanken. Schön, dass es so hilfsbereite Menschen, wie Euch, gibt. Besten Dank.

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