Textdatei in CSV Datei umwandeln



  • Hallo

    ich würde gerne mittels C++ eine Textdatei in eine CSV Datei umwandeln.

    Die Textdatei liegt in folgendem Stil vor:

    TEST-NR 0001
    DATUM 29-OKT-13
    GER[TNR 0000000113
    TEST-ART CODE
    ......

    TEST-NR 0002
    DATUM 29-OKT-13
    GER[TNR 0000000132
    TEST-ART CODE

    die CSV Datei sollte dann so aussehen:

    0001 29-OKT-13 0000000113 CODE
    0002 29-OKT-13 0000000132 CODE

    Um die ganzen Zeilenumbrüche zu entfernen habe ich folgenden Code benutzt:

    #include "stdafx.h" 
    #include <iostream> 
    #include <algorithm> 
    #include <iterator> 
    #include <fstream> 
    
    int main() 
    { 
          std::ifstream iStream("Beha.esca"); 
          std::ofstream tempStream("Beha.txt"); 
    
    std::replace_copy( std::istreambuf_iterator<char>(iStream), std::istreambuf_iterator<char>(), std::ostreambuf_iterator<char>(tempStream), '\n', '\t' );
    }
    

    Jetzt suche ich nach einer Möglichkeit nach einem Text zu suchen z.B. TEST-NR und durch einen Zeilenwechsel zu ersetzen.

    Habt Ihr vielleicht einen Tip für mich?

    Gruß

    Axel


  • Mod

    Ich würde den Ansatz anders wählen, als du es getan hast.

    Methode 1, wenn es auch drauf ankommt, die Quelldatei auf Korrektheit zu prüfen:
    -Datenstruktur definieren und Lesefunktion schreiben
    -Alle Datensätze lesen
    -Die Schreibfunktion der Datenstruktur gibt die Daten im Zielformat aus

    Methode 2, wenn es eher eine Konvertierung ist. Dies ist ähnlich zu deinem Ansatz, jedoch würde ich anders vorgehen. Diese Methode funktioniert unter der Annahme, dass die Datensätze alle im Format

    KEY VALUE
    

    vorliegen. Dann muss man noch festlegen, nach welchem Kriterium das Ende eines Datensatzes bestimmt werden kann (Key = TEST-ART?). Und dann liest man einfach alles ein, schmeißt die Keys weg und schreibt die Values hintereinander raus.

    Die Methode 1 ist deutlich flexibler und weniger fehleranfällig, die Methode 2 ist Quick & Dirty, aber gegebenenfalls ausreichend. Was besser ist, kommt drauf an, was du uns alles nicht gezeigt hast. So wie du das Problem momentan darstellst, würde ich Methode 2 nehmen, aber ich vermute mal, dass du das Problem vereinfacht dargestellt hast. Je nach Grad dieser Vereinfachung wird irgendwann Methode 1 besser.



  • Hallo SeppJ

    das Problem sitzt hinter dem Bildschirm 😉 da ich gerade die ersten geh versuche in C++ mache, da ich mit diversen Editoren da auch nicht weiterkomme.

    Gruß

    Axel



  • 1 Zeile Perl:

    while(<>){if(/^\s*\.+\s*$/){say""}elsif(/\s*\S+\s+(\S+)\s*){print"$1 "}}say""
    
    $ cat in.txt 
        TEST-NR 0001
        DATUM 29-OKT-13
        GER[TNR 0000000113
        TEST-ART CODE
        ......
    
        TEST-NR 0002
        DATUM 29-OKT-13
        GER[TNR 0000000132
        TEST-ART CODE 
    $ perl -E 'while(<>){if(/^\s*\.+\s*$/){say""}elsif(/\s*\S+\s+(\S+)\s*){print"$1 "}}say"";' <in.txt
    0001 29-OKT-13 0000000113 CODE 
    0002 29-OKT-13 0000000132 CODE
    

    Für die C++-Lösung: Probier mal das hier aus:

    #include <iostream>
    #include <string>
    int main()
    {
      std::string key, value;
      while (std::cin >> key >> value)
        std::cout << "Key: " << key << "\nValue: " << value << "\n\n";
    }
    

    Macht nicht ganz, was du willst, aber so würde man grundsätzlich mal vorgehen.


Anmelden zum Antworten