c und .csv


ButterBrot

Member
Joined
Jun 3, 2009
Messages
342
Location
Hamburg
LOCATION
Hamburg
Huhu,

ich weiss hier ist kein offizielles Programmierforum für Fragen beliebiger Art. Aber ich weiss auch, dass hier viele Meister der C-Sprache sind.

Also ich versuche eine csv Datei, die ich mit einem Progamm schreibe, einzulesen. D.h. ich kenne das Format und es wird keine Abweichungen geben.

Das Format soll so aussehen:

TEXT;TEXT1;TEXT3
TEXT1;TEXT2;TEXT3;

Also es soll Zeile für Zeile ausgelesen werden und dann Spalte für Spalte. Funktioniert auch soweit mit strcpy, aber wenn es eine Spalte gibt die keinen Wert hat, dann knallt mein Konzept logischer weise, da ja ein X;;X wie ein X;X ausgwertet wird, wenn ich strcpy benutze.

Gibt es da eine besser Methode? Ich habe versucht zu googeln, aber ich finde nichts.


Eine Datei könnte wie folgt aussehen:
Heidetau;Immer öfter; Ba
Karl;;Aga
Bert;Honululu;Spanien

cDelim ist ein ";" (also Semikolon)
cStream ist die aktuelle Zeile

Code:
void parse( char *cStream, char *cDelim, char cArr[][MAXFLDSIZE],int *iFldcount) {
    char*x=strtok(cStream,cDelim);
    int iFld=0;
    while(x){
        strcpy(cArr[iFld],x);
        iFld++;
        x=strtok(NULL,cDelim);
    }
    *iFldcount=iFld;

}

Würde mich über jeden Tipp freuen. :-(
 
Mit strtok() funktioniert das leider nicht, da strtok leere Token einfach überspringt. Daher musst Du dir dafür selbst eine Lösung basteln. Dazu könntest Du jede Zeile von hinten nach dem Delimiter durchsuchen, z.B. mit strrchr(). Von hinten deshalb, weil Du so sehr einfach die einzelnen Token herausnehmen könntest, indem Du, nach dem Du ein Delimiter-Zeichen gefunden hast, Dir das direkt darauf folgende Zeichen in einem char*-Pointer merkst (das wäre dann genau der Anfang von deinem Token) und anschließend das Delimiterzeichen in der Zeichenkette durch ein \0 ersetzt. Nun kannst Du an diesem Punkt die Zeichenkette auf die der char*-Pointer zeigt in dein Array kopieren.
Wenn Du anschließend die Suche nach dem Delimiter mit strrchr() wiederholst, würdest Du auf die selbe Weise nun das vorletzte Token finden und so weiter, bis Du kein weiteres Delimiter-Zeichen findest, also ganz am Anfang angekommen bist.
Leere Token werden so auch gefunden, sind aber dann einfach leere Zeichenketten, so wie Du es erwartest.
Der einzige Haken bei dieser Lösung ist halt, dass Du deine Elemente der jeweiligen Zeilen immer genau rückwärts in deinem Array ablegst.
 
:juhu:
Vielen Dank! O.k. ich hatte auch schon versucht Zeichen für Zeichen zu suchen. Ich dachte aber, dass wäre eher ein nicht so performanter Algorithmus. Ich werde es dann so machen wie du schreibst.

Danke noch mal :)
 
Back
Top