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 CODEdie CSV Datei sollte dann so aussehen:
0001 29-OKT-13 0000000113 CODE
0002 29-OKT-13 0000000132 CODEUm 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
-
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 ausMethode 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.