C - csv-Datei auslesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

C - csv-Datei auslesen

Beitrag von stampuhh » Di Jan 19, 2010 1:57 pm

Hey,

ich bastle mir gerade ein Programm zusammen um ein wenig besser in C rein zukommen. Dabei wollte ich eine Liste von Namen in einer Datei speichern. Da ich später aber vielleicht vorhatte mehrere Listen in der selben Datei zu speichern hab ich zu einer csv-Datei gegriffen (Xin hatte die glaube ich neulich irgendwo vorgeschlagen, da die einfach einzulesen sei).

Die Datei soll ungefähr so ausschauen wo bei die Zeilen unterschiedlich lang sind, also kein gleichmäßiges Muster haben.

Code: Alles auswählen

Horst;Dieter;Hans;Otto;Karl
Uschi;Frauke;Elke;Anne
Zum einlesen hatte ich an fscanf gedacht. Wenn es etwas besseres gibt immer her damit :roll:

Ich komme aber irgendwie nicht auf den passenden Formatstring, der mir jeden Namen einer Zeile liefert. Ich habe entweder immer eine Zeile als einen Eintrag oder immer nur den ersten Eintrag (also z.B. Horst) wenn ich %[^;] schreibe. Dummerweise läuft er dann auch in einer Unendlichschleife mit dem Code von unten.

Ich habe es jetzt erst mal damit es läuft auf ein Name pro Zeile abgeändert, aber das ist nicht das was ich gerne hätte ;)
Das schaut dann so aus:

Code: Alles auswählen

while (fscanf(file, "%s\n",buffer) != EOF)
        {
            //verarbeite buffer
        }
Hat irgendwer von euch einen Vorschlag? Ich hab gestern schon den ganzen Tag bei Google verbracht aber nur Beispiele gefunden, die mich nicht weiter gebracht haben. Am besten wäre halt wenn die erste Zeile mit den Namen eingelesen wird und jeder Name einmal verarbeitet werden kann. Die 2. Zeile würde ich dann z.B. in einer neuen while-Schleife (da andere Informationen) einlesen.

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: C - csv-Datei auslesen

Beitrag von Jside » Di Jan 19, 2010 2:03 pm

Ganze Zeile einlesen, und mit strtok(); zerteilen, wäre mein Vorschlag...
Siehe: http://www.proggen.org/doku.php?id=c:lib:string:strtok

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C - csv-Datei auslesen

Beitrag von stampuhh » Di Jan 19, 2010 3:23 pm

Danke schön!
Das funktioniert schon mal^^

Jetzt würde mich aber trotzdem noch interessieren ob es einen Formatstring gibt der das gleiche kann?

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C - csv-Datei auslesen

Beitrag von Xin » Di Jan 19, 2010 5:51 pm

stampuhh hat geschrieben:Zum einlesen hatte ich an fscanf gedacht. Wenn es etwas besseres gibt immer her damit :roll:
Ich lese meist die Datei komplett und gehe sie dann selbst durch.
Alle scanf-Funktionen sind relativ gefährlich. Ist die Datei falsch formatiert, bleibt so ein Programm gerne mal hängen.

Dein String sollte etwa so aussehen:

Code: Alles auswählen

while (fscanf(file, "%s;%s;%s;%s\n", buffer1, buffer2, buffer3, buffer4 ) != EOF)
        {
            //verarbeite buffer
        }
stampuhh hat geschrieben:Ich hab gestern schon den ganzen Tag bei Google verbracht aber nur Beispiele gefunden, die mich nicht weiter gebracht haben.
Du findest in den meisten Foren, dass Du bitte erstmal google zu rate fragen solltest. Dem stimme ich zu. Es ist hier aber durchaus okay, hier zu fragen, bevor Du alle von google indizierten Seiten durchgelesen hast ;->
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C - csv-Datei auslesen

Beitrag von stampuhh » Di Jan 19, 2010 6:22 pm

Xin hat geschrieben:
stampuhh hat geschrieben:Zum einlesen hatte ich an fscanf gedacht. Wenn es etwas besseres gibt immer her damit :roll:
Ich lese meist die Datei komplett und gehe sie dann selbst durch.
Alle scanf-Funktionen sind relativ gefährlich. Ist die Datei falsch formatiert, bleibt so ein Programm gerne mal hängen.
Naja die Gefahr gibt es ja erst einmal nicht, da ich die Datei selber schreibe und das Programm nur für mich ist. Aber gut zu wissen. Also meinst du vermutlich eine Art eigenen Parser schreiben zum einlesen? Und mit einlesen so eine Funktion wie fgets? Oder was wäre da zu empfehlen?
Xin hat geschrieben: Dein String sollte etwa so aussehen:

Code: Alles auswählen

while (fscanf(file, "%s;%s;%s;%s\n", buffer1, buffer2, buffer3, buffer4 ) != EOF)
        {
            //verarbeite buffer
        }
Ja das wäre die einfachste Methode. Dazu müsste ich nur halt wissen wie viele Namen ich in der Zeile habe und 4 bzw. 5 waren jetzt nur Beispiele. Deswegen verwende ich ja auch eine Liste und kein Array. Ich hatte mich halt gefragt ob es einen String gibt, der automatisch nach jedem ';' stoppt und somit dynamischer wäre ;)
Xin hat geschrieben:
stampuhh hat geschrieben:Ich hab gestern schon den ganzen Tag bei Google verbracht aber nur Beispiele gefunden, die mich nicht weiter gebracht haben.
Du findest in den meisten Foren, dass Du bitte erstmal google zu rate fragen solltest. Dem stimme ich zu. Es ist hier aber durchaus okay, hier zu fragen, bevor Du alle von google indizierten Seiten durchgelesen hast ;->
Darauf komme ich bestimmt noch mal zurück :P

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C - csv-Datei auslesen

Beitrag von stampuhh » Do Jan 21, 2010 12:30 pm

Wenn ich die Datei so zeilenweise einlese

Code: Alles auswählen

        
while(fgets(buf, BUF, file) != NULL)
{
//Verarbeiten
 }
ist das ja schön und gut. Aber was mache ich denn wenn in einer Zeile mal mehr als BUF-1 Zeichen stehen? Da muss es doch auch irgendwie eine elegante Methode geben eine beliebige Datei einzulesen, oder zumindest eine Datei die beliebig viele Zeichen in einer Zeile stehen hat? Andererseits würde ich das Programm damit ja anfällig gegen Overflows machen oder nicht? :roll:

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C - csv-Datei auslesen

Beitrag von Dirty Oerti » Do Jan 21, 2010 2:39 pm

Xin meinte, du sollst die komplette Datei einlesen, und sie dann selbst durchgehen.
Das heißt, du ließt mit fgets Zeichen für Zeichen der Datei in EINEN riesigen String, teilst denn dann auf an den newline-Zeichen und bekommst dadurch deine Strings der jeweiligen Zeilen.
Die kannst du dann weiterverarbeiten.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
stampuhh
Beiträge: 211
Registriert: Sa Nov 07, 2009 4:39 pm
Wohnort: Paderborn

Re: C - csv-Datei auslesen

Beitrag von stampuhh » Do Jan 21, 2010 2:45 pm

Aber fgets liest ja selber nur bis zum newline Zeichen ein oder nicht? Zumindest bricht es bei mir am Ende der Zeile immer ab ;)
Mein Code von oben liest ja jede Zeile bis zum \n ein und die kann ich dann verarbeiten. Das habe ich schon hinbekommen.

Mein Problem ist ja eher wie dimensioniere ich den String in den ich einlese. Er könnte ja immer Buffer+1 Zeichen groß sein. Also ein Zeichen mehr als ich vorher eingeplant hatte.
Nehmen wir an ich schreibe fgets(buf,4,file) und in meiner Datei steht jetzt "test" drin? Liest er dann nicht nur "tes" ein?

sprich:
Xin meinte, du sollst die komplette Datei einlesen
und genau das habe ich nicht verstanden bzw. ich weiß nicht wie.

gruß stampuhh
NachDenkSeiten.de

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: C - csv-Datei auslesen

Beitrag von Dirty Oerti » Do Jan 21, 2010 3:06 pm

Achso :)

Naja, also du könntest nun z.B. mit fread immer ein einzelnes char einlesen (solange eben chars in der Datei sind) und dieses dann an einen String anfügen.
http://tutorial.proggen.org/doku.php?id ... tdio:fread

Dadurch kann es nicht passieren, dass dein Buffer zu klein ist, denn du liest ja immer nur ein Zeichen auf einmal ein.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: C - csv-Datei auslesen

Beitrag von nufan » Do Jan 21, 2010 3:41 pm

Dirty Oerti hat geschrieben: Naja, also du könntest nun z.B. mit fread immer ein einzelnes char einlesen (solange eben chars in der Datei sind) und dieses dann an einen String anfügen.
http://tutorial.proggen.org/doku.php?id ... tdio:fread

Dadurch kann es nicht passieren, dass dein Buffer zu klein ist, denn du liest ja immer nur ein Zeichen auf einmal ein.
... oder:
* mit fseek ans Ende der Datei gehen
* Anzahl der Bytes auslesen (ftell)
* Speicher für die von ftell zurückgelieferte Menge an Zeichen reservieren (malloc)
* mit fseek an den Anfang der Datei gehen
* mit fread den gesamten Dateiinhalt einlesen

Du solltest die Datei im Binärmodus öffnen, sonst kann ftell Probleme machen (Hab ich gehört, ist mir aber noch nie passiert. Schaden kanns nicht die Datei binär zu öffnen.).
Genauere Infos zu den erwähnten Funktionen findest du im Wiki.

Antworten