Probleme beim lesen von .csv-Datei
-
hab hier eine csv-datei:
1;test;divx 2;noch einer;svcd 3;letzter test;dvd-r
nun wollte ich die datei öffnen und die einzelnen elemente der 1. zeile in variablen speichern. aber irgendwie weiss ich nicht wie ich das mach wenn 2 textfelder aufeinander folgen. wenn ich "divx" durch eine zahl ersetze, gehts wieder. Weiss jemand wie ich das mache?
#include <stdio.h> #include <stdlib.h> #define LEN 100 int main() { FILE *file = fopen("C:\\test.csv", "rb"); char buffer; char title[LEN]; char form[10]; int number = 0, format = 0; if (file==NULL) fprintf(stdout, "Error opening file...\n\n"); else { fscanf(file, "%d;\%[^'\;]%c;%s", &number, &title, &form); fprintf(stdout,"Number: %d\nTitle: %s\nFormat: %s\n", number, title, form); } }
daraus entsteht folgende ausgabe, wobei ich zwischen ; & test komische zeichen erhalte die hier nicht dargestellt werden können (hab sie geändert):
Number: 1 Title: test Format: ;±±±±±±±±±±±±±±±±±±test Press any key to continue
folgende variante funktioniert bis auf den hinteren semikolon:
fscanf(file, "%d;\%[^'\;]%s;%s", &number, &title, &form); fprintf(stdout,"Number: %d\nTitle: %s\nFormat: %s\n", number, title, form);
ausgabe ist dann:
Number: 1 Title: test Format: ;10 Press any key to continue
falls irgendjemand ne working version hat von sowas oder ne bessere methode hat, ne csv datei zu verarbeiten, ich bin dankbar um jede hilfe...
-
lies alle felder als string ein, dann mach die konvertierung.
ich seh dein problem einfach nicht. setz dich dran und probiere doch selber mal ein wenig.
strings in einem scanf duerfen kein & davor haben. lies eine referenz oder ein gutes buch und bitte debugge deine programme, bevor du sie postest.
-
Habs mit scanf auch nicht hinbekommen. Das tut was du willst ist aber ganz sicher keine optimale Lösung.
#include <stdio.h> #include <stdlib.h> #define LEN 100 int main() { FILE *file = fopen("test.csv", "rb"); char buffer[LEN]; char title[50]; char form[50]; int number = 0; char * pch; if (file==NULL) fprintf(stdout, "Error opening file...\n\n"); else { while ( !feof(file) ) { buffer[0]=0; title[0]=0; form[0]=0; number = 0; fgets( buffer, sizeof(buffer), file ); pch = (char *)strtok ( buffer, ";"); if ( 0 != pch ) { number=atoi(pch); pch = (char*)strtok (NULL, ";"); if ( 0 != pch ) { strcpy( title, pch ); pch = (char*)strtok (NULL, ";\n"); if ( 0 != pch ) { strcpy( form, pch ); } } fprintf(stdout,"Number: %d\nTitle: %s\nFormat: %s\n\n", number, title, form); } } } } Kurt
-
ich bitte dich. lies ein tutorial. wenn du scanf nicht benutzen kannst, dann brauchst ganz dringend ein tutorial.
geht denn der jetzige code?
-
c.rackwitz schrieb:
ich bitte dich. lies ein tutorial. wenn du scanf nicht benutzen kannst, dann brauchst ganz dringend ein tutorial.
Ok dann zeig mal wie du 3 strings( eventuell mit leerzeichen ) mit scanf am ';' teilst. Würde mich auch interessieren. ( tutorial-lesen ist für weicheier. Wenn ich selbst nicht draufkomme machts keinen spass.
)
Kurt
-
du bist wohl einer von denen, die etwas teures kaufen und weils ein bisschen kippelt, das handbuch drunterstecken anstatt es zu lesen?
also, scanf verkraftet keine leerzeichen. deshalb musst du die zeile mit strtok zerlegen oder selber parsen.
funzt der code?
-
Ja klar funktionierts mit strtok. Nur eben nicht mit scanf. Das war aber die ursprüngliche Fragestellung ( BTW nicht meine Frage ).
Hab übrigens die Erfahrung gemacht dass in den Handbüchern sowieso nie das drinsteht was ich gerade wissen möchte. Also besser selbst ausprobieren.
Kurt
-
danke für deine mühe zuk, ich kannte die funktion strtok nicht, aber die kann ich brauchen...
-
hehe, hab nicht gemerkt, dass ihr nicht der gleiche seid...
-
c.rackwitz schrieb:
strings in einem scanf duerfen kein & davor haben.
Nicht ganz - Beispiel:
sscanf (&szIn [iPosInt], "%d", iResult); //szIn - String zum Einlesen //iPosInt - Position des Integers //iResult - Ergebnis
-
str[index] ist ein char und kein string, deswegen der & davor.
es ginge auch str+index und ohne &.so und jetz lies "the c programming language, second edition" oder berichtige mich richtig.
(soll nicht als angriff gemeint sein, nur als herausvorderung)
-
Und es geht doch mit scanf.
#include <stdio.h> #include <string.h> void scan_it( const char * inp ) { int nr; char txt[50]; char par[50]; sscanf(inp, "%d;%[^;];%[^;\n]", &nr, txt, par ); printf( "\nnr = %02d\ntxt= '%s'\npar= '%s'\n", nr, txt, par); } int main() { char *inp1 = "1;some text;pars-1"; char *inp2 = "2;test;divx"; char *inp3 = "3;noch einer;svcd"; char *inp4 = "4;letzter test;dvd-r "; scan_it( inp1 ); scan_it( inp2 ); scan_it( inp3 ); scan_it( inp4 ); }
nr = 01 txt= 'some text' par= 'pars-1' nr = 02 txt= 'test' par= 'divx' nr = 03 txt= 'noch einer' par= 'svcd' nr = 04 txt= 'letzter test' par= 'dvd-r '
Kurt
-
nicht schlecht herr specht
das könnte ne gute lösung sein für mein problem. danke fürs kopfzerbrechen
-
[quote="c.rackwitz"
es ginge auch str+index und ohne &.
[/quote]Wenn ich folgendes mache:
char szString [11]; strcpy (szString, "0123456789"); printf ("%s\n", &szString [2]); printf ("%s\n", szString + 2);
Erzeugt dies jedesmal den gleichen Output. Die erste ersion zeigt aber besser was passiert. Bei der zweiten Version werden eigentlich zwei Dinge vermengt: Ein int und ein Pointer. Das ist ein wenig wie das alte
szString++; /* No-No!*/
Moderne Compiler weigern sich einfach soetwas umzusetzen - aus guten Grund.
-
sorry, aber ich kenne keinen compiler, der sowas verweigert. und damit du den richtigen eindruck von mir hast:
ich weiss, wie ich mit pointern umzugehen hab und ich hasse ungarische notation (aus gutem grund).natuerlich ist deine variante ok. allerdings aendert das nichts an der tatsache, dass ein char* einem printf nicht nochmal ein & braucht.
die sache mit pointer++ solltest du auch akzeptieren. damit sparst du extra indexvariablen und schneller als str[index] ist es auch (inkrement <-> inkrement und addition). und damit du mich nicht fuer daemlich haeltst, ich inkrementiere keine arrays und wenn ich mit malloc() speicher geholt hab, dann gebe ich hinterher mit free() genau den selben pointer wieder frei (auch wenn ich den errechnen sollte...)
im uebrigen hats nicht mehr viel mit dem thema zu tun.
-
OK - Man lernt nie aus. Ich bin da etwas gebranntes Kind und habe da offensichtlich meine Brandnarben vor 10 Jahren weitergefuehrt. Der gcc 3.3.3 gibt lediglich eine Warning aus, wenn die Variable von einer bestimmten Groesse im Stack definiert wurde. Also etwa
char *szString = "0123456789"; szString++;
(und selbst das nur wenn der -pedantic Flag gesetzt wurde; was ich aber aus lieber Gewohnheit immer mache; ist eigentlich auch gut zu stehen). Der gcc 4.0 laesst dies ohne Probleme durchgehen.
Ich glaube, meine Abneigung kommt noch aus der Zeit, als staendig der Pointer und int miteinander vermischt wurden.
-
(soll nicht als angriff gemeint sein, nur als herausvorderung)
25 die die Rechtschreibfehler in den Postings korrigieren
MfG SideWinder
-
ok, herausforderung mit f. aber was soll die 25 bedeuten?!?
pointer und ints vermischen ist doch nichts boeses. sind ja beides nur zahlen... man muss es nur koennen *g*
-
c.rackwitz schrieb:
pointer und ints vermischen ist doch nichts boeses. sind ja beides nur zahlen... man muss es nur koennen *g*
Weil es zwei hoechst unterschiedliche Datentypen sind und solche nie miteinander vermischt werden duerfen. Das wiederspraeche den Grundsaetzen der strukturierten Programmierung.
-
hoechstunterschiedlich? duerfen niemals nicht mit einander vermischt werden?
ein int ist signed, ein pointer nicht.
ein int ist 1 machine-word breit, ein pointer auch (erschiess mich doch, wenn du ne architektur findest, wo das nicht so ist!)
sonst noch unterschiede? noe.
ja klar, das typsystem gibts nicht, damit ich es ignorieren kann. es hat seinen sinn und ist hilfreich. aber deswegen darf ich es doch auch mal umgehen, wenns mir gerade passt, oder?es wuerde gewissen grundsaetzen widersprechen?
also wirklich. das klingt ja geradezu, als ob ich da was unmoralisches machen wuerde.es gibt da so ein schoenes wort: "glaubenskrieg".
ich denke, man sollte jedem seine freiheit lassen.
dazu gehoert auch, jemandem seinen schlechten stil nicht unter die nase zu reiben, was nicht heisst, dass man diesen dann auch akzeptieren muss, wenn man mit dem code arbeiten soll.(hab meinen post absichtlich sarkastisch geschrieben und kann diesen sarkasmus nur als form des humors rechtfertigen. mir war einfach danach. fuehle dich bitte nicht persoenlich angegriffen, ist nicht so gemeint)
SideWinder: die frage aus meinem post weiter oben steht noch...