Zeilenanzahl einer CSV datei ermitteln



  • Hallo!

    Ich würde gerne von einer CSV Datei die Anzahl der Zeilen ermitteln damit ich danach einen passend großen Speicher dafür anlegen kann.

    Nur scheitert es schon bei der Ermittlung der Zeilenanzahl

    #include <stdio.h>
    #include <stdlib.h>
    
    int readCSV() {
        FILE *fz = NULL;    
        int x = 1;
    
        fz = fopen ("F:\\Test.csv", "r");
    
        if (fz == NULL) {
            printf ("Fehler beim Oeffnen der csv Datei!\n");
            fflush(stdin);
            return EXIT_FAILURE;
        }
    
        while (fscanf(fz, "") != EOF) {
        	x++;
        }
    
        printf("%d", x);
        fflush(stdin);
        return EXIT_SUCCESS;
    }
    

    Jetzt habe ich das Problem, dass das Programm in der while schleife hängen bleibt. Also es zählt die Variable x hoch ohne das EOF abbricht.

    Hat jemand eine Idee an was das liegen könnte?

    godi



  • godi schrieb:

    Hallo!

    Hallo!!!!

    godi schrieb:

    Jetzt habe ich das Problem, dass das Programm in der while schleife hängen bleibt. Also es zählt die Variable x hoch ohne das EOF abbricht.

    Ach so.

    godi schrieb:

    Hat jemand eine Idee an was das liegen könnte?

    Ja, an dem:

    godi schrieb:

    while (fscanf(fz, "") != EOF) {
        	x++;
        }
    

    Genug getrollt.

    Das Problem ist, dass fscanf(fz, "") nichts ausliest. Aber wundert dich das? Ohne Formatbezeichner funktioniert da nichts. Im Übrigen sind für solche Zählungen eher getchar oder getline geeignet. Beim ersterem musst du nur die Anzahl '\n' zählen, bei zweiterem nur die Anzahl Funktionsaufrufe (so wie du das jetzt gemacht hast). Den Gebrauch der Funktionen liefert dir die Dokumentation.



  • Frei nach GNU wc:

    #define BUFFER_SIZE (16 * 1024)
    
    char buf[BUFFER_SIZE];
    char *p;
    size_t bytes_read;
    size_t line_count = 0;
    FILE *fd;
    
    fd = fopen("datei.txt", "r");
    
    do {
      p = buf;
    
      bytes_read = fread(buf, 1, BUFFER_SIZE, fd);
    
      while((p = memchr(p, '\n', buf + bytes_read - p))) {
        ++p;
        ++line_count;
      }
    } while(bytes_read != 0);
    

    GNU wc benutzt dafür POSIX-Funktionen (und erhebt nebenher noch andere Daten), also sieht der konkrete Code da ein bisschen anders aus, aber das Konzept ist das selbe. Es ist schneller, Speicher zu durchsuchen, als für jedes Zeichen das Dateisystem zu befragen.


Anmelden zum Antworten