(In C) CSV Datei auslesen

Buba235

Erfahrenes Mitglied
Hallo!

Ich habe gestern schon einmal geschrieben wie ich einen bestimmten String aus einer CSV Datei auslesen kann. Ihr habt mir auch geholfen und es funktioniert auch einwandfrei. Es gibt nur 2 kleine Problemchen :)

1. Beim Auslesen der Strings "verschluckt" er mir immer die letzte Zeile. Der String der letzten Zeile wird also nicht ausgegeben. Wie kann ich das ändern?

2. Wenn zwischen den beiden Kommas, aus denen mein Programm den String auslesen soll kein Wert steht, dann liest er einfach solange weiter bis wieder ein Wert kommt und gibt mir dann diesen aus. Leider ist das dann der falsche. Wie kann ich dieses Problem lösen? (Die Datei schaut so aus: aa,bb,cc,,,dd,ee ->also ohne Leerzeichen zwischen den leeren Kommas)

Hier mal der Code:

Code:
void datei_ausgeben(FILE *datei) {

        /*Variablen*/
        int i;
        FILE *super;
        char *word = NULL;
        char buffer[LINE_SIZE];
        char *gelesene_Kommas = ",";

        super = fopen("/home/tracer/wlan_DB/alert_files/super.txt", "wt");


        /*Datei zum Lesen oeffnen*/
        datei = fopen("/home/tracer/wlan_DB/alert_files/test.txt", "rt");
        if (datei == NULL) {
                fprintf(stderr, "Fehler beim Oeffnen der Datei zum Auslesen!\n");
                exit(EXIT_FAILURE);
        }

        /*Jede Zeile durchgehen und immer den String einlesen der nach i = ? kommt*/
        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                word = strtok(buffer, gelesene_Kommas);
                for(i = 0; word != NULL; i++) {
                        if (i == 0) {
                                fprintf(super, "%s\n", word);
                                break;
                        }
                        word = strtok(NULL, gelesene_Kommas);
                }
        }

        /*Datei schliessen*/
        fclose(datei);
        fclose(super);
}

Die zweite Datei (super.txt) benutze ich nur, um zu sehen wieviele Zeilen er mir ausgibt und was er mir alles ausgibt. Ich hoffe ihr könnt mir helfen! Danke schon mal!
 
Zuletzt bearbeitet:
Hallo,

ueber 2. bin ich selber auch schonmal gestoßen... Da hilft nur sich seinen eigenen String tokenizer
zu schreiben:

C:
#include <stdio.h>

char* mystrtok(char* s, char delim){
    char* curr = NULL;
    char* ret = NULL;
    static char* buffer = NULL;
    if(s)
        buffer = s;
    curr = buffer;
    if(curr){
        while(*curr != delim && (*(curr++)) != '\0');
        if(*curr == '\0')
            return NULL;
        *curr = '\0';
        ret = buffer;
        buffer = curr + 1;
    }
    return ret;
}

int main(){
    char word[] = "This,is,,,a,long,sentence,which,is,,seperated,with,commas";
    char* token = mystrtok(word, ',');
    while(token != NULL){
        printf("%s\n", token);
        token = mystrtok(NULL, ',');
    }
    return 0;

Zu 1. kann ich nicht viel sagen, das Stueck Kode von dir funktioniert bei mir so wie es sollte.
Im andren Post hattest du geschireben "nach dem 3. Komma". In deinem Kode steht aber "i == 0".
Eventuell liegt da der Fehler?

Gruß

RedWing
 
Zuletzt bearbeitet:
Hallo!


Danke für die Hilfe. Ich komm aber nicht klar mit meiner Datei! Bei deinem Code ist word ja ein char-Array und wird mit s an die Funktion übergeben. Ich muss dafür aber einen File-pointer haben. Tja da liegt mein Problem.

Und wegen dem i == 0 -> das ist egal. Ich habe Wert 3 nur als Beispiel geschrieben. Das ganze soll ja variabel bleiben. Übrigens verschluckt er mir bei einer anderen Datei die letzten 20 Zeilen!
 
Danke für die Hilfe. Ich komm aber nicht klar mit meiner Datei! Bei deinem Code ist word ja ein char-Array und wird mit s an die Funktion übergeben. Ich muss dafür aber einen File-pointer haben. Tja da liegt mein Problem.

Die Funktion soll auch nicht als ersatz fuer deine Funktion stehen, sondern als Ersatz fuer strtok():

ansatt
Code:
        ...
        /*Jede Zeile durchgehen und immer den String einlesen der nach i = ? kommt*/
        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                word = strtok(buffer, gelesene_Kommas);
        ...

so
Code:
        char gelesene_Kommas = ',';
        ...
        /*Jede Zeile durchgehen und immer den String einlesen der nach i = ? kommt*/
        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                word = mystrtok(buffer, gelesene_Kommas);
        ...

Übrigens verschluckt er mir bei einer anderen Datei die letzten 20 Zeilen!

Da kann ich dir leider auch nicht weiterhelfen. Eventuell postest du die Datei einfach mal, welche Probleme
macht...

Gruß

RedWing
 
Hallo!

Sorry! Tja das kommt davon wenn man nicht mitdenkt. Ich habs jetzt geändert und es läuft einwandfrei. Mit allerdings EINER kleinen Ausnahme. Er gibt nur noch Leerzeichen aus. In meiner erzeigten Datei (über fprintf(super, "%s\n", word)) steht also "nix" drin. Es werden eben nur die Leerzeichen hineingeschrieben. Was versteh ich denn da jetzt falsch?

Hier der Code:

Code:
void strings_ausgeben(FILE *datei) {

        /*Variablen*/
        int i;
        FILE *super;
        char *word = NULL;
        char gelesene_Kommas = ',';
        char buffer[LINE_SIZE];
        const char *path = "/home/tracer/wlan_DB/alert_files/2006_05_21_22_WLAN_DB.txt";

        super = fopen("/home/tracer/wlan_DB/alert_files/super.txt", "wt");


        /*Datei zum Lesen oeffnen*/
        datei = fopen(path, "rt");
        if (datei == NULL) {
                perror("Fehler beim Oeffnen der Datei zum Auslesen ");
                exit(EXIT_FAILURE);
        }

        /*Jede Zeile durchgehen und immer den String einlesen der nach i = ? kommt*/
        while(fgets(buffer, LINE_SIZE, datei) != NULL) {
                word = mystrtok(buffer, gelesene_Kommas);
                for(i = 0; word != NULL; i++) {
                        if (i == 0) {
                                fprintf(super, "%s\n", word);
                                break;
                        }
                        word = mystrtok(NULL, gelesene_Kommas);
                }
        }

        /*Datei schliessen*/
        fclose(datei);
        fclose(super);
}/*Ende der Funktion datei_ausgeben*/


/*----------------------------------------------------------------------------*/
/*Funktionsbeschreibung*/
char* mystrtok(char *s, char delim) {

        /*Variablen*/
        char *curr = NULL;
        char *ret = NULL;
        static char *buffer = NULL;

        if (s) {
                buffer = s;
        }
        curr = buffer;

        if (curr) {
                while((*curr != delim) && (*(curr)) != '\0') {
                        if (*curr == '\0') {
                                return NULL;
                        }
                        *curr = '\0';
                        ret = buffer;
                        buffer = curr + 1;
                }
        }
        return ret;
}/*Ende der Funktion mystrtok*/
 
Hallo,
du hast die Funktion mystrtok() falsch implementiert...

RedWing hat gesagt.:
C:
#include <stdio.h>

char* mystrtok(char* s, char delim){
    char* curr = NULL;
    char* ret = NULL;
    static char* buffer = NULL;
    if(s)
        buffer = s;
    curr = buffer;
    if(curr){
        while(*curr != delim && (*(curr++)) != '\0');
        if(*curr == '\0')
            return NULL;
        *curr = '\0';
        ret = buffer;
        buffer = curr + 1;
    }
    return ret;
}

Gruß

RedWing
 
Danke vielmals!


Es funktioniert. Ich hatte das ++ bei (*(curr++)) überlesen und dann hat er sich aufgehangen, also hab ich die while-Schleife um alles drum rum gebastelt. Deshalb gabs nur Leerzeichen. Jetzt geht aber alles wunderbar. Danke nochmal!

Was den Fehler mit den verschluckten Zeilen angeht, da werd ich mich jetzt erst mal drüber machen. Sollte ich da nicht weiter kommen werd ich das noch posten, aber ich will euch alle hier ja nicht zu sehr in Anspruch nehmen!

Also Danke nochmal und Ciao
Buba
 
Hallo,
Es funktioniert. Ich hatte das ++ bei (*(curr++)) überlesen und dann hat er sich aufgehangen, also hab ich die while-Schleife um alles drum rum gebastelt. Deshalb gabs nur Leerzeichen. Jetzt geht aber alles wunderbar. Danke nochmal!

Kein Problem. Immer wieder gerne :)

Gruß

RedWing
 

Neue Beiträge

Zurück