Parser umsetzen?
-
Hallo Leute,
ich will ein kleines Umsetzungstool schreiben, um meine Datenbestände
zu konvertieren. Ich hab hier einen haufen txt-Files die wieder in txt
überführt werden müssen. Allerdings müssen die Werte in der Datei verschoben
werden.Das sieht etwa so aus:
Meine Datei (Inhalt):a,c,b,d,e,z,
Neue Datei (Inhalt):
a,b,c,d,e,z,
Nun war mein erster Gedanke jede Zeile einzeln einzulesen und
in ein CStringArray zu schreiben, und dann dem obigen Beispiel
entsprechend aus dem Array die jeweilige Position zu lesen:Pos: 0,2,1,4,5,6
Aber macht das Sinn es so anzustellen? Zudem werden noch neue Trennzeichen
gesetzt, aber das ist ja eher trivial (statt , zB ; ).
-
Petti schrieb:
Aber macht das Sinn es so anzustellen? Zudem werden noch neue Trennzeichen
gesetzt, aber das ist ja eher trivial (statt , zB ; ).Jupp, das geht mit CString::Replace
-
Ja, Find und Replace, so habe ich das auch vor.
Ich habe auch schon eine Vorstellung wie ich das mit
dem parsen mache.Wenn ich eine Datenübernahme von Software A nach Software X
mache, wird es dann nicht ähnlich umgesetzt?
Export-Dokument von A einlesen. Variablen an die richtigen
Stellen schreiben (für Software und dann richtige Trennzeichen
setzen. In Software X dann über Import neu erzeugtes Doc einlesen.Was kann bei einer solchen Umsetzung schiefgehen, an was sollte
man besonders denken? Gibts evtl "Universalparser", die man entsprechend
anpassen kann (Trennzeichen, Anzahl der einzulesenden Variablen pro Zeile,
Neupositionierung der Variablen in Ausgabedokument)?Dann müsste ich das Rad nicht neu erfinden
Obwohl es sicher eine nette Übung wäre.
-
Ich habe mal einen Parser für exportierte SQL-Tabellen geschrieben, den man mit den CREATE TABLE scripten füttern konnte. Daran hat der erkannt, ob Typen oder die Spaltenreihenfolge geändert werden mussten.
Allerdings liegen die Rechte nicht bei mir, ich weiß nicht, ob die das rausgeben.Aber mit ein paar Zusatzfunktionen sollte das trotzdem relativ schnell gemacht sein. Üb ruhig.
-
So, da bin ich wieder und habe natürlich gleich ein Problem
Ich lese jetzt eine Textdate (hat 5 Zeilen) ein und will mit einem
CStringArray dann die Positionen der eingelesenen Werte später in der
neuen Datei an die richtige Position schreiben.Das Programm schmiert mir allerdings ab.
Und ich hab keine Ahnung warum das so ist.
Der Debugger steht in fgets.c bei_ASSERTE(str != NULL);
CStringArray awert; int p=0; //textadtei zeilenweise einlesen CString string,wert,zeigen; CStdioFile File; File.Open("c:\\testfile.txt", CFile::modeRead,NULL); while(File.ReadString(string)) { p++; wert = string; int position1 = wert.Find(';'); CString zeigen=(wert.Left(position1)); awert.Add(zeigen); int position2=wert.Find(';',position1+1); zeigen=wert.Mid(position1+1,position2-position1-1); awert.Add(zeigen); //usw. bis Zeile 5 CString schreiben=""; int zeichen=0; zeichen=awert.GetCount(); if(p<=zeichen) { schreiben+=awert.GetAt(laden); schreiben+=";"; }else { schreiben+="\"\";"; } //array leeren! awert.RemoveAll(); }
-
Kannst du denn sagen, wann er die Meldung liefert? Nach welcher Zeile?
-
Schau dir mal den Callstack an, in welcher Zeile in deinem Code passiert das?
(Ne Anleitung zum Debuggen gibts im Magazin.)
-
Hi, also im Callstack wird das so angezeigt:
> testparser.exe!_lock_file(void * pf=0x00000000) Zeile 236 C > testparser.exe!fgets(char * string=0x00b12f98, int count=129, _iobuf * str=0x00000000) Zeile 60 + 0x23 C
Ich habe wohl vergessenn File.close(); nach der While-Schleife zu setzen,
aber dennoch bleiben die gleichen Fehler bestehen.
-
Zeig mal mehr vom Callstack bitte.
Da müssen irgendwann Klassennamen und Funktionsnamen auftauchen, die du kennst.
-
Keine weitere Mühe. Es hat sich geklärt. Ich habe in diesem
Rumspielcode vergessen eine Überprüfung zu setzen, ob die Datei
überhaupt vorhanden ist, die ich parsen will.
Und meine liebe Freundin hat eben unsere USBHDD ausgeschaltet
(steht im Nebenzimmer)
Also war die Datei nicht mehr zu finden = Absturz.Frauen!!
Immerhin bin ich jetzt dank dir auf das Tutorial für den Debugger gestoßen