String aus CSV teilen mit strtok



  • Hallo Zusammen,

    ich bin neu in C (bisher habe ich nur in Java programmiert) und habe da ein Problem mit dem Zerlegen eines Strings, den ich aus einer CSV lese. Die CSV ist Semikolon-getrennt und es gibt oft leere Zellen. Wenn ich nun die CSV einlese und mit strtok splitte, überspringt das Programm die leeren Zellen einfach. Wie stelle ich es an, dass das Programm diese Zellen auch ausgibt? Hier der bisherige Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
      FILE *f; 
      f = fopen("data.csv", "r"); 
      char daten[2000]; //Puffer für Zeilen von 'f'
      char *ptr; //Zeiger zum Teilen der Zeilen
    
      int spalte;
    
      if(f == NULL){
           printf("Fehler beim Oeffnen.\n");
      }
      else{
          //data.csv zeilenweise einlesen und in 'daten' speichern      
          int x = 0;
          while(fgets(daten, sizeof(daten),f) != 0){
               //daten bei ';' splitten und ausgeben
               int i = 1;
               ptr = strtok(daten, ";");
               while(ptr != NULL){
                    printf("Zelle %i: %s\n", i,ptr);
                    ptr = strtok(NULL, ";");
                    i++;           
               }
               if(++x >=5)//nach 5 Zeilen der CSV-Datei abbrechen
                    break;           
          }
      }
    
      fclose(f);
      return 0;
    }
    

    Danke schonmal für eure Hilfe...



  • strtok fasst aufeinanderfolgende Trennzeichen als eins auf.

    Du musst dir mit strchr oder strpbrk oder strcspn selber was schreiben.
    Oder gleich den String zeichenweise absuchen.

    strtok verändert den Quellstring, indem es an die Stellen der Trennzeichen eine '\0' schreibt.

    Im Forum gibt es aber auch Beispiele für so eine Funktion. Da musst du mal die Suche bemühen.



  • Ob das mit der Funktion in diesem Forum ist, kann ich gerade zu so früher Stunde nicht sagen.
    Meist läuft das unter den Namen split oder strsplit oder ähnlichem




Anmelden zum Antworten