csv datei und sscanf



  • hallo!

    ich habe ein problem beim auslesen von csv dateien.

    und zwar:

    eine zeile in der csv datei sieht wie folgt aus:

    nachname;vorname vorname;geschlecht;alter;plz

    ich öffne die datei, und lese zeilenweise aus in einen char* zeile.

    dann mache ich ein sscanf, das wie folgt aussieht;

    sscanf(zeile, "%s;%s;%s;%d;%s", nachname, vorname, geschl, &alter, plz);
    

    jetzt steht im nachname die ganze zeile drin, weil er ';' nicht als trennzeichen kennt, vermute ich mal, also hab ich die zeile mal so aufgebaut:

    nachname - vorname vorname - geschlecht - alter - plz

    sscanf(zeile, "%s - %s - %s - %d - %s", nachname, vorname, geschl, &alter, plz);
    

    hierbei habe ich das problem, dass er das leerzeichen zwischen 2 vornamen nicht checkt und erst wieder was falsches drin steht.

    hat von euch jemand eine idee, wie ich das lösen könnte?
    wenn jemand 2 vornamen hat, dann sollte im vorname zum beispiel: "stefan michael" drinstehen

    danke schonmal,

    mfg



  • phuN schrieb:

    ...
    ich öffne die datei, und lese zeilenweise aus in einen char* zeile.
    ...

    holst du dir den speicher für die zeile mit malloc oder wie machst du das?
    mit sscanf müsste das klappen, so wie du das geschrieben hast.



  • so, in einer while schleife:

    fgets(zeile, sizeof(zeile), in)
    


  • Hallo phuN,

    ich hab' das Problem so gelöst:

    sscanf (zeile, "%[^;];%[^;];%[^;];%i;%s", nachname, vorname, geschl, &alter, plz);
    

    Zur Erklärung:
    Bei den ersten drei Zeichenketten liest er jeweils bis zum Semikolon. Danach ein Integer und ein weiterer String.

    Gez. monstermunchkin



  • Es funktioniert!!

    genau das was ich wollte!

    vielen, vielen Dank!! 🙂 👍



  • monstermunchkin schrieb:

    Hallo phuN,
    ich hab' das Problem so gelöst:

    sscanf (zeile, "%[^;];%[^;];%[^;];%i;%s", nachname, vorname, geschl, &alter, plz);
    

    Zwar alt, aber hab nichts andres gefunden dazu:

    Wenn ich nun folgenden String vorliegen habe:

    zeile[] = { "Meier;Peter;;15;10023"};
    

    Wie sage ich dem Compiler nun, dass ich 0 bis unendlich Zeichen bis zum nächsten Strichpunkt erwarte und nicht 1 bis unendlich?
    Denn obige Situation führt bei mir dazu, dass Alter und Postleitzahl nicht gefüllt sind...


Log in to reply