Zeilenweises Auslesen aus CSV-Datei (unbekannter Formatierung und Länge)



  • Das traue ich mir wirklich nicht zu.

    Würde gerne noch mal auf strtok() zurückkommen.
    Da ich die Tabelle aus der Tabellenkalkulation in CSV umwandele, kann ich vorher alle Semikolon, die eigentlich zum Text gehören (Token habt ihr das genannt?) mit irgendwas anderem (z.B. Komma) ersetzen.

    Wie wärs damit?
    Damit kann ich dann aber nicht zählen, wo ich mich gerade befinde, was?!?



  • sega schrieb:

    Würde gerne noch mal auf strtok() zurückkommen.

    strtok() ist eine sehr simple Funktion, die so arbeitet: sie geht zeichenweise durch einen String, bis sie zu einem Trennzeichen kommt. Das Trennzeichen überschreibt sie mit einer Null, und merkt sich das überschriebene Zeichen und seine Adresse. Dann gibt sie einen Zeiger auf den Anfang des Tokens zurück, den man als String verwenden kann, weil er mit einer Null abgeschlossen ist. Beim nächsten Aufruf macht es die Änderungen am Eingabe-String rückgängig und beginnt von neuem, bis kein Zeichen mehr im Eingabe-String ist.

    Dabei ist wichtig, dass strtok() auf den Eingabe-String schreiben muss. Das könnte Probleme machen, zB wenn mehrere Threads mit dem String arbeiten.

    strtok() ist übrigens gar nicht für CSV gedacht, eher um zB alle Token in einem C-Programm durchzugehen. Dafür müsste man nur die Whitespace-Zeichen als Trenner angeben. Deshalb liefert strtok() auch keinen leeren String, wenn es bei ;; vorbeikommt, sondern geht einfach weiter.

    sega schrieb:

    Damit kann ich dann aber nicht zählen, wo ich mich gerade befinde, was?!?

    Verstehe ich nicht.
    🙂



  • Verstehe mittlerweile auch nichts mehr.
    Bin jetzt doch mehr verunsichtert als erleuchtet.

    Ich weiß jetzt leider auch nicht die richtigen Fragen zu stellen, um gute Antworten zu bekommen.

    Ich werde das jetzt erst mal verdauen und werde später noch mal darauf zurück kommen.



  • Zeichenweise einlesen und überprüfen. Ggf. zu einem Buffer hinzufügen.



  • sega schrieb:

    Ich weiß jetzt leider auch nicht die richtigen Fragen zu stellen, um gute Antworten zu bekommen.

    Versuch doch erstmal, den Code für eine Zeile hinzubekommen.



  • Habe ich versucht, sieht so aus:

    char *pch;					
    char c[10000];  		  	
    
    FILE *file;
    
    file = fopen("reacdat.csv", "r"); 
    
    if(file==NULL) {
       Message0("Error: can't open file.\n");
    }
    else {
    
    Message0("File opened successfully. Contents:\n\n");
    
    while(fgets(c, 10000, file)!=NULL) { 		
    
       zeile++;
    
       Message0("String: %s", c);
    
       if(zeile == 18){
          Message0("Zeile 18: \n");
          pch = strtok(c, ";");
          Message0("Erster Aufruf: %s\n",pch);
    
          while (pch != NULL){
             Message0("Schleife\n");
             i++;
             pch = strtok(c, ";");
             Message0("%i: %s\n",i,pch);
             pch = strtok(NULL, ";");
          }
       }
    
    }
    

    Die Ausgabe der Tokens für Zeile 18

    #1;FeS[s];#;#;#;#;#; ===>;Fe[s];0.5 S2[g];#;#;#;#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    

    spuckt leider nur das erst Token aus:

    1: #1
    

    danach ist die while-Schleife auch schon zu Ende.

    Habe mich dabei am Refernz-Beispiel für strtok orientiert.
    http://www.cplusplus.com/reference/clibrary/cstring/strtok/

    Tja, wie muss das dann richtig sein?!



  • Die Funktion strtok ist hier nicht geeignet, darauf hat dich ja mngbd schon hingewiesen:
    Denn wenn in der Zeile Zeichenketten mit Trennzeichen vorkomen, z.B. "on>=1;off=0", dann gibt es Datensalat.

    Hier wäre es angebracht, sich jedes Zeichen einzeln anzusehen und zu prüfen, was zu tun ist.

    while ( ( c = fgetc(fp) ) != EOF  )
    	{
    ...
    

    Gruß,
    B.B.



  • Ja ok. Und wie ich bereits erwähnt hatte, sind jetzt alle ; durch , ersetzt worden und dann wurde erst das CSV geschrieben.
    Also im CSV sind nur noch ; vorhanden, wenn Sie auch als Trennzeichen gemeint sind.

    Somit würde ich gerne strtok() nutzen, denn ich habe das Gefühl das so halb verstanden zu haben. Zumindest bis zum ersten Token.
    Darüber hinaus scheint ja was faul zu sein ...



  • sega schrieb:

    Ja ok. Und wie ich bereits erwähnt hatte, sind jetzt alle ; durch , ersetzt worden und dann wurde erst das CSV geschrieben.
    Also im CSV sind nur noch ; vorhanden, wenn Sie auch als Trennzeichen gemeint sind.

    Ok.

    sega schrieb:

    Darüber hinaus scheint ja was faul zu sein ...

    Jepp. Deine Orientierung ist etwas schiefgelaufen, probier mal das:

    int i = 0;
    	char test[] = "wurst;brot;marmelade";
    	char* separator = ";", *pch = strtok( test, separator ); 
    
    	while ( pch != NULL )
    	{ 
    		i++, printf ( "%i: %s\n", i, pch );
    		pch = strtok ( NULL, separator );
    	}
    


  • sega schrieb:

    Ja ok. Und wie ich bereits erwähnt hatte, sind jetzt alle ; durch , ersetzt worden und dann wurde erst das CSV geschrieben.
    Also im CSV sind nur noch ; vorhanden, wenn Sie auch als Trennzeichen gemeint sind.

    Ist das ein Witz? CSV steht für Comma Separated Values.



  • Janjan schrieb:

    sega schrieb:

    Ja ok. Und wie ich bereits erwähnt hatte, sind jetzt alle ; durch , ersetzt worden und dann wurde erst das CSV geschrieben.
    Also im CSV sind nur noch ; vorhanden, wenn Sie auch als Trennzeichen gemeint sind.

    Ist das ein Witz? CSV steht für Comma Separated Values.

    Nein. Aber da kann ich doch nix dafür, wenn jemand im Excel/OpenOffice innerhalb einer Zelle ein ; als Trennzeichen verwendet und das dann beim Konvertieren nach CSV trouble macht. Deshalb habe ich die ; die zum Eintrag gehören vor dem Konvertieren ausgetauscht.



  • Big Brother schrieb:

    Deine Orientierung ist etwas schiefgelaufen

    Jepp, funktioniert jetzt. Danke!


Anmelden zum Antworten