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 👍


Log in to reply