ich muss 2 CSV-Dateien auf Übereinstimmung bestimmter Felder prüfen
und das Ergebnis als 3. CSV Datei ausgeben.
Um den Einlesevorgang zu testen, habe ich ein kleines Programm
erstellt, dass die erste CSV einliest und direkt wieder ausgibt. Hier
treten schon Schwierigkeiten auf.
CSV Datei
20091110;20091106;20090713;11090365;640;VorlageBaugruppen;1,0;50;
20091110;20091106;20090713;11090365;640;VorlageBaugruppen;1,0;50;
20091111;20091109;20091111;11090644;556;a_grlitzskalarbasiccomada;
5,0;50;
CODE:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
FILE *CSV;
char ar1_artbez[40];
int lip_liefwo, lip_bestterm, lip_wtermin, lip_aufnr, lip_kunde,
lip_diffme, lip_priorita;
if(argc < 2) {
fprintf(stderr, "Verwendung : %s datei.csv\n", *argv);
return EXIT_FAILURE;
}
CSV = fopen(argv[1], "r");
if(NULL == CSV) {
fprintf(stderr, "Fehler beim Oeffnen ...\n");
return EXIT_FAILURE;
}
/* Nun lesen Sie formatiert von der Datei ein ... */
while((fscanf(CSV,"%d;%d;%d;%d;%d;%s;%d,0;%d;\n",
&lip_liefwo, &lip_bestterm ,&lip_wtermin, &lip_aufnr,
&lip_kunde ,&ar1_artbez, &lip_diffme ,&lip_priorita)) != EOF )
fprintf(stdout,"lip_liefwo:%d | lip_bestterm:%d | lip_wtermin:
%d | lip_aufnr:%d | lip_kunde:%d | ar1_artbez:%s | lip_diffme:%d |
lip_priorita:%d\n",
lip_liefwo, lip_bestterm, lip_wtermin, lip_aufnr, lip_kunde,
ar1_artbez, lip_diffme, lip_priorita);
return EXIT_SUCCESS;
}
Anmerkung: ;%d,0; weil in der csv an der Stelle immer ,0 steht
AUSGABE
lip_liefwo:20091110 | lip_bestterm:20091106 | lip_wtermin:20090713 |
lip_aufnr:11090365 | lip_kunde:640 | ar1_artbez:VorlageBaugruppen;
1,0;50; | lip_diffme:1074308878 | lip_priorita:-1073742223
lip_liefwo:20091110 | lip_bestterm:20091106 | lip_wtermin:20090713 |
lip_aufnr:11090365 | lip_kunde:640 | ar1_artbez:VorlageBaugruppen;
1,0;50; | lip_diffme:1074308878 | lip_priorita:-1073742223
lip_liefwo:20091111 | lip_bestterm:20091109 | lip_wtermin:20091111 |
lip_aufnr:11090644 | lip_kunde:556 |
ar1_artbez:a_grlitzskalarbasiccomada;5,0;50; | lip_diffme:1074308878 |
lip_priorita:-1073742223
fscanf liest anscheinend ar1_artbez bis zum Zeilenende und die Werte
für lip_diffme und lip_priorita kommen aus dem Nirvana!?
Original sieht die CSV wiefolgt aus
20091110;20091106;20090713;11090365;640;Vorlage Baugruppen;1,0;50;
20091110;20091106;20090713;11090365;640;Vorlage Baugruppen;1,0;50;
20091111;20091109;20091111;11090644;556;a_grlitzskalarbasiccomada;
5,0;50;
D.H. in ar1_artbez können durchaus Leerzeichen vorhanden sein.
Jedoch läuft mit dieser CSV das Programm in eine Endlosschleife.
Was mache ich falsch?
Oder läuft das darauf hinaus, dass ich jedes Zeichen einzel einlesen
muss und die CSV "parsen" muss.
Gruss
Ralf
'%s' liest bis zum n�chsten Whitespace. Du willst vermutlich '%['.
Au�erdem empfiehlt es sich, eine Maximalgr��e anzugeben.
Dass 'fscanf' die letzten zwei Parameter nicht gelesen hat, h�tte dir
ansonsten der R�ckgabewert verraten.
> Oder l�uft das darauf hinaus, dass ich jedes Zeichen einzel einlesen
> muss und die CSV "parsen" muss.
Das ist tendenziell eine gute Idee, weil du somit auf Ungereimtheiten
viel besser reagieren kannst. Wenn 'fscanf' sagt "ich hab 3 Felder
gelesen", wei�t du nicht, wo der Fehler lag und wie du die n�chste Zeile
findest. Und selbst, wenn 'fscanf' dir 8 Felder liefert, k�nnten die auf
zwei Zeilen a 4 Felder verteilt gelegen haben. Schlie�lich gibt es auch
noch Programme, die CSV mit Quotes schreiben, um z.B. Strings mit
Leerzeichen und/oder Semikola drin darstellen zu k�nnen.
Stefan
> while((fscanf(CSV,"%d;%d;%d;%d;%d;%s;%d,0;%d;\n",
^^^
Genau hier liegt Dein Problem: "%s" liest grunds�tzlich bis zum n�chsten
Whitespace (Leerzeichen, Tabulator, Newline etc.). Versuch's mal mit
"%[^;]".
Auch solltest Du bei Zeichenfolgen _immer_ eine maximale L�nge mit
angeben. Ansonsten kann es Dir passieren, dass mehr eingelesen wird, als
in das Array hinein passt.
fscanf() sagt Dir �brigens immer, wie viele Werte erfolgreich eingelesen
wurden, und nicht nur EOF im Fehlerfall. Nutze dies.
Gru�. Claus
--
) )
(,) Ich w�nsche allen Mitlesern (,)
__|__ ein gesegnetes Weihnachtsfest __|__
| | | |
>> Oder l�uft das darauf hinaus, dass ich jedes Zeichen einzel einlesen
>> muss und die CSV "parsen" muss.
>
> Das ist tendenziell eine gute Idee, weil du somit auf Ungereimtheiten
> viel besser reagieren kannst.
Auch auf Gereimtheiten kann man n�tigenfalls richtig reagieren.
http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm#FileFormat
Wenn man nicht vereinbart, dass kompliziert gereimte CSVs
zeilenweise verworfen werden k�nnen, braucht man wohl
einen Parser mit Fehlerkorrektur.
(Ich hatte schon das Vergn�gen, "CSV"s zu verarbeiten,
die nicht mit Zeilen in records zerlegt waren, sondern
pro "record" feldweise gez�hlt werden sollten.
Solange es gut geht, fein.
Sonst entweder heuristische Verfahren versuchen,
um einen Wiedereinstieg zu finden, oder falls m�glich
neue, alternative Daten anfordern...)
> ich muss 2 CSV-Dateien auf Übereinstimmung bestimmter Felder prüfen und
> das Ergebnis als 3. CSV Datei ausgeben.
>
> Um den Einlesevorgang zu testen, habe ich ein kleines Programm erstellt,
> dass die erste CSV einliest und direkt wieder ausgibt. Hier treten schon
> Schwierigkeiten auf.
>
> CSV Datei
> 20091110;20091106;20090713;11090365;640;VorlageBaugruppen;1,0;50;
> 20091110;20091106;20090713;11090365;640;VorlageBaugruppen;1,0;50;
> 20091111;20091109;20091111;11090644;556;a_grlitzskalarbasiccomada;
> 5,0;50;
...
> Oder läuft das darauf hinaus, dass ich jedes Zeichen einzel einlesen
> muss und die CSV "parsen" muss.
Ich empfehle fgets zum lesen ganzer Zeilen und dann eine Zerlegung der
Zeile.
Hierbei kann auf die Funktionen strchr(), strpbrk(), strcspn() oder strtok
()
zurückgegriffen werden. Oder eine einfache, selbstgestrikte Funktion.
#define DIM 8 /* Zahl der Felder */
char buf[100]; /* Gross genug für eine Zeile */
char *argv[DIM];
char *p;
int n;
while ((p = fgets(buf, sizeof buf, file)))
{
n = 0;
argv[n++] = p;
while (n < DIM && *p)
{
if (*p == ';' || *p == '\n')
{
*p++ = 0;
argv[n++] = p;
}
else p++;
}
/* Fehlende Felder ergaenzen (Alternative: Zahl der belegten Felder
merken) */
while (n < DIM)
argv[n++] = "";
}
Grüße
Erich
--
EFEU 3.2 is released!
Get the open source from http://efeu.cybertec.at.
Wieso "Sprachen"? Wer hat wo etwas von einer "Sprache" CSV geschrieben?
CSV steht f�r "comma separated values" und bezeichnet ein Datenformat.
> Ich ben�tige also eine Spezifikation der Sprache, deren
> Startsymbol eingelesen werden soll, und der Name �CSV� ist
> noch keine Spezifikation.
Also wenn Du f�r dieses triviale, intuitiv erfassbare Datenformat noch
eine Spezifikation brauchst ...
Was meinst Du eigentlich mit "Startsymbol"?
> Auch auf Gereimtheiten kann man nötigenfalls richtig reagieren.
> http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm#FileFormat
Nett, aber leider eine sehr amerikanische Sichtweise.
Es fehlen die alternativen Zeichen für den Dezimalpunkt entsprechend
der Locale des Benutzers und die daraus folgenden alternativen
Feldtrenner. Siehe auch das Beispiel des OP.
--
Viele Grüße,
Jens Schmidt
> Stefan Ram schrieb:
>> Die normale Vorgehensweise besteht für mich darin,
>> »CSV« erst einmal zu definieren. Es gibt nämlich viele
>> verschiedene Sprachen, die »CSV« genannt werden.
>
> Wieso "Sprachen"? Wer hat wo etwas von einer "Sprache" CSV geschrieben?
>
> CSV steht für "comma separated values" und bezeichnet ein Datenformat.
>
>> Ich benötige also eine Spezifikation der Sprache, deren
>> Startsymbol eingelesen werden soll, und der Name »CSV« ist
>> noch keine Spezifikation.
>
> Also wenn Du für dieses triviale, intuitiv erfassbare Datenformat noch
> eine Spezifikation brauchst ...
>
> Was meinst Du eigentlich mit "Startsymbol"?
Ich fasse mal zusammen und übersetze:
Stefan Ram:
Wenn Du ein Auto fahren willst, besonders im Ausland, dann
musst Du vorher einen Führerschein machen und viele Verkehrsregeln
lernen.
Claus Reibenstein:
Wieso Verkehrsregeln? Ich fahre einfach nur, wenn die Straße frei ist.
Stefan Ram:
Am Besten besorgst Du Dir mal eine Straßenverkehrsordnung und besuchst
einfach mal eine Fahrschule.
Claus Reibenstein:
Für sowas intuitiv erfassbares wie "Straße frei" brauche ich doch keine
extra Literatur.
Was meinst Du übrigens mit "Fahrschule"?
SCNR,
Jens Schmidt
> Ich fasse mal zusammen und übersetze:
Nicht alles, was hinkt, ist auch ein Vergleich.
Gruß. Claus
--
) )
(,) Ich wünsche allen Mitlesern (,)
Ein Regelwerk zur Konstruktion von Zeichenfolgen aus Zeichen aka
Terminalsymbolen nennt der Informatiker "Sprache".
> CSV steht f�r "comma separated values" und bezeichnet ein Datenformat.
>
>> Ich ben�tige also eine Spezifikation der Sprache, deren
>> Startsymbol eingelesen werden soll, und der Name �CSV� ist
>> noch keine Spezifikation.
>
> Also wenn Du f�r dieses triviale, intuitiv erfassbare Datenformat noch
> eine Spezifikation brauchst ...
Dann zeig mal her. Frage 1: warum hei�t das hier "CSV", wo doch Semikola
als Trennzeichen genutzt werden? Frage 2: wie werden Felder dargestellt,
deren Text ein Trennzeichen oder ein Newline enth�lt? Welcher Zeichen-
satz wird �berhaupt benutzt? Frage 3: sollte das Problem von Frage 2
durch Anf�hrungszeichen oder Escapezeichen gel�st werden, wie wird ein
Anf�hrungszeichen oder Escapezeichen dargestellt? Frage 4: wie werden
rationale Zahlen dargestellt (Punkt oder Komma? '1.0e+001'?)? Frage 5:
wie werden ganze Zahlen dargestellt (gilt '0x'?)? Frage 6: wie werden
leere Felder dargestellt? D�rfen sie weggelassen werden?
Vor Beantwortung dieser Fragen w�rde ich zumindest nicht anfangen zu
implementieren. Und das Ergebnis dieser durchaus nichttrivialen
Beantwortung w�rde ich dann durchaus Spezifikation nennen.
> Was meinst Du eigentlich mit "Startsymbol"?
Ganz ehrlich, bei dir und dem Herrn Ram frage ich mich manchmal, ob ihr
wirklich praktisch entwickelt oder nur �ber der ISO-Norm meditiert.
Nichts f�r ungut & frohes Fest,
Stefan (der heute mal Pl�tzchen statt Programme compiliert)
> Claus Reibenstein wrote:
>
>> Stefan Ram schrieb:
>>
>>> Die normale Vorgehensweise besteht f�r mich darin,
>>> �CSV� erst einmal zu definieren. Es gibt n�mlich viele
>>> verschiedene Sprachen, die �CSV� genannt werden.
>>
>> Wieso "Sprachen"? Wer hat wo etwas von einer "Sprache" CSV geschrieben?
>
> Ein Regelwerk zur Konstruktion von Zeichenfolgen aus Zeichen aka
> Terminalsymbolen nennt der Informatiker "Sprache".
Das reicht bei Weitem nicht. Nach dieser Definition w�ren JPG, BMP, GIF,
MP3, WAV etc. ebenfalls Sprachen.
> Dann zeig mal her. Frage 1: warum hei�t das hier "CSV", wo doch Semikola
> als Trennzeichen genutzt werden?
Aus historischen Gr�nden: Im englischsprachigen Raum - da kommt das
Format her - kennt man kein Dezimalkomma, sondern nur einen
Dezimalpunkt. Somit war es dort kein Problem, das Komma als Trennzeichen
zu verwenden. Im Deutschen z.B. ist das Komma jedoch bereits anderweitig
belegt, weshalb hierzulande meist das Semikolon bevorzugt wird. Das
K�rzel CSV hat sich trotzdem hartn�ckig gehalten.
> Frage 2: wie werden Felder dargestellt,
> deren Text ein Trennzeichen oder ein Newline enth�lt?
Mittels Textbegrenzer (meist Anf�hrungsstriche).
> Welcher Zeichen-
> satz wird �berhaupt benutzt?
Dar�ber gibt es IMHO keine einheitliche Regelung.
> Frage 3: sollte das Problem von Frage 2
> durch Anf�hrungszeichen oder Escapezeichen gel�st werden, wie wird ein
> Anf�hrungszeichen oder Escapezeichen dargestellt?
Durch Verdopplung desselben:
"Geht nicht" gibt's nicht --> """Geht nicht"" gibt's nicht"
> Frage 4: wie werden
> rationale Zahlen dargestellt (Punkt oder Komma? '1.0e+001'?)?
Das interessiert CSV nicht. CSV kennt nur Zeichenfolgen.
> Frage 5:
> wie werden ganze Zahlen dargestellt (gilt '0x'?)?
Dito.
> Frage 6: wie werden
> leere Felder dargestellt?
Ein leeres Feld ist - wie der Name schon sagt - leer, hat also keinen
Inhalt. Also wird auch kein Inhalt dargestellt. Wo ist das Problem?
> D�rfen sie weggelassen werden?
Mit ein bisschen Nachdenken solltest Du von alleine auf die richtige
Antwort kommen.
> Vor Beantwortung dieser Fragen w�rde ich zumindest nicht anfangen zu
> implementieren. Und das Ergebnis dieser durchaus nichttrivialen
> Beantwortung w�rde ich dann durchaus Spezifikation nennen.
>
>> Was meinst Du eigentlich mit "Startsymbol"?
>
> Ganz ehrlich, bei dir und dem Herrn Ram frage ich mich manchmal, ob ihr
> wirklich praktisch entwickelt oder nur �ber der ISO-Norm meditiert.
Ersteres seit etwa 35 Jahren, Letzteres nicht ganz so lange.
> Nichts f�r ungut & frohes Fest,
Dir ebenso.
Es freut mich, dass ich durch meine kleine Anfrage eine rege
Diskussion angeregt habe.
Ich bedanke mich für Eure Hilfe Hilfe und Anregungen und habe Eure
Diskussion mit Interesse verfolgt.
Ich wunsche Allen ein frohes Fest.
Gruss
Ralf
Sind es doch? Die Beschreibung von RIFF (Basisformat von WAV) auf
<http://msdn.microsoft.com/en-us/library/ms779636(VS.85).aspx> ist einer
Grammatik nicht un�hnlich. Die ISO 11172-3 (MP3) beschreibt den MP3-
Bitstrom ebenfalls mit einem einer (Attribut-)Grammatik �hnlichen
Formalismus.
Letztlich ist das �blicherweise etwas anderes als BNF, und auch meistens
keine regul�re oder kontextfreie Sprache, aber dennoch immer noch eine
Sprache.
>>Dann zeig mal her. Frage 1: warum hei�t das hier "CSV", wo doch Semikola
>>als Trennzeichen genutzt werden?
>
> Aus historischen Gr�nden: Im englischsprachigen Raum - da kommt das
> Format her - kennt man kein Dezimalkomma, sondern nur einen
> Dezimalpunkt. Somit war es dort kein Problem, das Komma als Trennzeichen
> zu verwenden. Im Deutschen z.B. ist das Komma jedoch bereits anderweitig
> belegt, weshalb hierzulande meist das Semikolon bevorzugt wird. Das
> K�rzel CSV hat sich trotzdem hartn�ckig gehalten.
Damit handelt es sich schon mal nicht um ein eindeutiges Format, sondern
eine Formatfamilie, weil die Amis ein anderes Trennzeichen benutzen als
die Deutschen. Man kann auch Tabs oder Doppelpunkte nutzen.
>>Frage 2: wie werden Felder dargestellt,
>>deren Text ein Trennzeichen oder ein Newline enth�lt?
>
> Mittels Textbegrenzer (meist Anf�hrungsstriche).
[...]
>>Frage 3: sollte das Problem von Frage 2
>>durch Anf�hrungszeichen oder Escapezeichen gel�st werden, wie wird ein
>>Anf�hrungszeichen oder Escapezeichen dargestellt?
>
> Durch Verdopplung desselben:
> "Geht nicht" gibt's nicht --> """Geht nicht"" gibt's nicht"
Das ist eine h�ufige M�glichkeit, aber ich w�rde wetten, dass es bei
weitem nicht die einzige ist.
>>Frage 4: wie werden
>>rationale Zahlen dargestellt (Punkt oder Komma? '1.0e+001'?)?
>
> Das interessiert CSV nicht. CSV kennt nur Zeichenfolgen.
Denjenigen, der die Daten nachbearbeiten will, interessiert das schon.
Und das ist nicht ganz unwichtig. Wenn man mit Excel zum Beispiel eine
Datei importiert, die in einer Spalte sowas enth�lt
01c3
05ab
0a32
0e54
10c9
129c
wird eine Zelle davon den Wert 0 haben.
>>Frage 6: wie werden leere Felder dargestellt?
>
> Ein leeres Feld ist - wie der Name schon sagt - leer, hat also keinen
> Inhalt. Also wird auch kein Inhalt dargestellt. Wo ist das Problem?
>
>>D�rfen sie weggelassen werden?
>
> Mit ein bisschen Nachdenken solltest Du von alleine auf die richtige
> Antwort kommen.
Mir sind schon Dateien �ber den Weg gelaufen, wo leere Felder am Ende
der Zeile weggelassen wurden.
Ansonsten ging es mir nicht unbedingt um eine direkte Beantwortung der
Fragen, sondern prim�r sollte erstmal der OP kl�ren, mit welchen
Sonderlocken er zu rechnen hat. Wenn er Gl�ck hat und die Ersteller-
seite vollst�ndig kontrolliert, kann er z.B. m�glicherweise 'fscanf'
einsetzen. Vielleicht ist aber auch ein vollst�ndiger Parser mit allen
Schikanen n�tig.
Okay, inzwischen gibt es einen RFC zu CSV (#4180). Aber ob man sich
darauf berufen kann? Sowohl der RFC als auch die referenzierten Quellen
verweisen auf die Unspezifiziertheit diverser Randf�lle in der Praxis.
Immerhin spezifiziert der RFC das Format als Sprache, mit einer Grammatik.
Es gibt 'nen RFC zu CSV. Was man nicht alles Heiligabend vor'm
Zubettgehen noch alles lernt. Cheers,
Stefan
> Claus Reibenstein wrote:
>
>> Stefan Reuther schrieb:
>>
>>> Ein Regelwerk zur Konstruktion von Zeichenfolgen aus Zeichen aka
>>> Terminalsymbolen nennt der Informatiker "Sprache".
>>
>> Das reicht bei Weitem nicht. Nach dieser Definition w�ren JPG, BMP, GIF,
>> MP3, WAV etc. ebenfalls Sprachen.
>
> Sind es doch?
Nein. Es sind Dateiformate.
>>> Dann zeig mal her. Frage 1: warum hei�t das hier "CSV", wo doch Semikola
>>> als Trennzeichen genutzt werden?
>>
>> Aus historischen Gr�nden: Im englischsprachigen Raum - da kommt das
>> Format her - kennt man kein Dezimalkomma, sondern nur einen
>> Dezimalpunkt. Somit war es dort kein Problem, das Komma als Trennzeichen
>> zu verwenden. Im Deutschen z.B. ist das Komma jedoch bereits anderweitig
>> belegt, weshalb hierzulande meist das Semikolon bevorzugt wird. Das
>> K�rzel CSV hat sich trotzdem hartn�ckig gehalten.
>
> Damit handelt es sich schon mal nicht um ein eindeutiges Format, sondern
> eine Formatfamilie, weil die Amis ein anderes Trennzeichen benutzen als
> die Deutschen. Man kann auch Tabs oder Doppelpunkte nutzen.
Ja. Und? Der Poster hat ein Beispiel gepostet, an welchem _eindeutig_ zu
erkennen ist, welches Trennzeichen bei ihm tats�chlich Verwendung
findet. Man muss schon _sehr_ blind sein, um das nicht zu erkennen.
>>> Frage 2: wie werden Felder dargestellt,
>>> deren Text ein Trennzeichen oder ein Newline enth�lt?
>>
>> Mittels Textbegrenzer (meist Anf�hrungsstriche).
> [...]
>>> Frage 3: sollte das Problem von Frage 2
>>> durch Anf�hrungszeichen oder Escapezeichen gel�st werden, wie wird ein
>>> Anf�hrungszeichen oder Escapezeichen dargestellt?
>>
>> Durch Verdopplung desselben:
>> "Geht nicht" gibt's nicht --> """Geht nicht"" gibt's nicht"
>
> Das ist eine h�ufige M�glichkeit, aber ich w�rde wetten, dass es bei
> weitem nicht die einzige ist.
Diese Wette d�rftest Du verlieren.
>>> Frage 4: wie werden
>>> rationale Zahlen dargestellt (Punkt oder Komma? '1.0e+001'?)?
>>
>> Das interessiert CSV nicht. CSV kennt nur Zeichenfolgen.
>
> Denjenigen, der die Daten nachbearbeiten will, interessiert das schon.
Was meinst Du mit "nachbearbeiten"?
> Und das ist nicht ganz unwichtig. Wenn man mit Excel zum Beispiel eine
> Datei importiert, die in einer Spalte sowas enth�lt
> 01c3
> 05ab
> 0a32
> 0e54
> 10c9
> 129c
> wird eine Zelle davon den Wert 0 haben.
Das hat aber nichts mit CSV zu tun, sondern mit Excel. Wenn diese Werte
nicht als Zahlen, sondern als String interpretiert werden sollen, muss
man sie entsprechend darstellen, damit auch Excel das erkennt.
>>> Frage 6: wie werden leere Felder dargestellt?
>>
>> [...]
>>
>>> D�rfen sie weggelassen werden?
>>
>> Mit ein bisschen Nachdenken solltest Du von alleine auf die richtige
>> Antwort kommen.
>
> Mir sind schon Dateien �ber den Weg gelaufen, wo leere Felder am Ende
> der Zeile weggelassen wurden.
Ja. Sch�n. Und? Wenn die Sprache leere Felder am Ende einer Zeile
gleichsetzt mit nicht vorhandenen Feldern, kann sie das ja auch
gefahrlos tun.
Interessanter sind leere Felder innerhalb einer Zeile, und da lautet die
Antwort eindeutig: Nein.
> Ansonsten ging es mir nicht unbedingt um eine direkte Beantwortung der
> Fragen
Warum stellst Du sie dann?
> sondern prim�r sollte erstmal der OP kl�ren, mit welchen
> Sonderlocken er zu rechnen hat.
S.o.
> Okay, inzwischen gibt es einen RFC zu CSV (#4180).
Kannte ich noch nicht. Best�tigt aber meine Annahmen.
http://www.wotsit.org/ bietet zum Thema CSV eine ZIP-Datei zum Download
an, welches eine Textdatei mit der Beschreibung des CSV-Formats enth�lt.
> Stefan Reuther <stefa...@arcor.de> writes:
>
>> Okay, inzwischen gibt es einen RFC zu CSV (#4180).
>
> Sobald man eine Grammatik hat, kann man einen Parser schreiben.
>
> #include <stdio.h> /* printf */
>
> [Jede Menge unkommentierten C-Code]
Kanone. Spatzen. Im �brigen sinn- und wertlos.
Claus Reibenstein wrote:
> Stefan Reuther schrieb:
>
>> Claus Reibenstein wrote:
>>
> [...]
>>> Das reicht bei Weitem nicht. Nach dieser Definition wären JPG, BMP, GIF,
>>> MP3, WAV etc. ebenfalls Sprachen.
>>
>> Sind es doch?
>
> Nein. Es sind Dateiformate.
Wenn ein Binärhaufen nach der von JPEG vorgegebenen Struktur im Speicher
liegt (oder gar auf einem System, welches gar keine Dateien kennt), mithin
also an keine Datei mehr gebunden ist: wie nennst du es dann? Hint: für den
Informatiker ist es immernoch ein Wort der durch die Grammatik von JPEG
definierten Sprache. Nur weil du den Begriff "Sprache" auf
Programmiersprachen beschränkst muss das nicht die ganze Welt so tun.
Ob man jetzt gleich mit einer formalen Grammatik auf CSV einklopfen muss sei
mal dahingestellt. Vermutlich tut's ein fscanf oder strtok auch. Das kann
aber nur der OP beantworten, wenn er weiß, was ihn alles erwartet in solch
einer als "CSV" bezeichneten Datei.
> [...]
>>> Durch Verdopplung desselben:
>>> "Geht nicht" gibt's nicht --> """Geht nicht"" gibt's nicht"
>>
>> Das ist eine häufige Möglichkeit, aber ich würde wetten, dass es bei
>> weitem nicht die einzige ist.
>
> Diese Wette dürftest Du verlieren.
Schon das Escaping dieser Zeichen in C ist ein Gegenbeispiel: "\"". Nix mit
Verdoppelung.
Die Nachfragen von Stefan sind IMO schon berechtigt: was einem manchmal so
als CSV über den Weg läuft kann die wildesten Konstrukte enthalten. Speziell
das Escaping mittels \ habe ich schon hier und da gesehen. Es kommt also
darauf an, wie gut der OP seine Datenquelle unter Kontrolle hat.
Bis dann
Markus
--
hey..dein problem ist: du kommst mit nem schwert zu ner schießerei..
Mausibaer in fem.flame
> Genau hier liegt Dein Problem: "%s" liest grundsätzlich bis zum nächsten
> Whitespace (Leerzeichen, Tabulator, Newline etc.). Versuch's mal mit
> "%[^;]".
>
> fscanf() sagt Dir übrigens immer, wie viele Werte erfolgreich eingelesen
> wurden, und nicht nur EOF im Fehlerfall. Nutze dies.
>
Hab ich probiert.
Der String ar1_artbez wird jetzt richtig ausgegeben, jedoch nicht
lip_diffme, lip_priorita.
Ab dem 2. Datensatz rennt das Programm jetzt in eine Endlosschleife.
...
while((anz=fscanf(CSV,"%d;%d;%d;%d;%d;%[^;]%d,0;%d;\n",
&lip_liefwo, &lip_bestterm ,&lip_wtermin, &lip_aufnr, &lip_kunde
,&ar1_artbez, &lip_diffme ,&lip_priorita)) != EOF )
fprintf(stdout,"Anzahl:%d \nlip_liefwo:%d \nlip_bestterm:%d
\nlip_wtermin:%d \nlip_aufnr:%d \nlip_kunde:%d \nar1_artbez:%s
\nlip_diffme:%d \nlip_priorita:%d\n",
anz, lip_liefwo, lip_bestterm, lip_wtermin, lip_aufnr,
lip_kunde,
ar1_artbez, lip_diffme, lip_priorita);
return EXIT_SUCCESS;
=>
Anzahl:6
lip_liefwo:20091110
lip_bestterm:20091106
lip_wtermin:20090713
lip_aufnr:11090365
lip_kunde:640
ar1_artbez:Vorlage Baugruppen
lip_diffme:1074308878
lip_priorita:-1073742214
Anzahl:0
lip_liefwo:20091110
lip_bestterm:20091106
lip_wtermin:20090713
lip_aufnr:11090365
lip_kunde:640
ar1_artbez:Vorlage Baugruppen
lip_diffme:1074308878
lip_priorita:-1073742214
lip_wtermin:20090713
lip_aufnr:11090365
lip_kunde:640
ar1_artbez:Vorlage Baugruppen
lip_diffme:1074308878
lip_priorita:-1073742214
usw usw.
Datenformat?
> Hint: f�r den
> Informatiker ist es immernoch ein Wort der durch die Grammatik von JPEG
> definierten Sprache.
Kommt drauf an was du unter "Informatiker" genau verstehst. Vielleicht
die Leute auf der Uni, vor allem die Theoretiker, aber von den Leuten
die praktisch mit solchen Formaten arbeiten kenn ich keinen der sowas
"Sprache" nennt.
> Nur weil du den Begriff "Sprache" auf
> Programmiersprachen beschr�nkst muss das nicht die ganze Welt so tun.
Wieso auf "Programmiersprachen" beschr�nkt? Ich geh davon aus dass er
deutsch ohne weitere Diskussion auch als Sprache bezeichnet.
Aber nur weil du solche Datenformate als Sprachen bezeichnest, muss das
nicht die ganze Welt so tun.
Tom
Kaum. Man muss schon sehr blind sein, wenn man glaubt dass im
Datenformat des OP die " Anf�hrungszeichen als Trennzeichen verwendet
werden. Ansonsten h�tte er wohl auch gleich die Spalte mit den
Leerzeichen in solche gesetzt gehabt.
Und in meiner beruflichen Praxis hab ich eigentlich auch �fter mit
CSV-Daten zu tun, bei denen ein " keine Spezialbedeutung hat
und Zeilenenden innerhalb einer Spalte einfach nicht erlaubt sind,
als umgekehrt. (Nicht dass ich damit andeuten will, das sei die
h�ufigere Variante, es geht nur darum aufzuzeigen dass die Definition
von CSV-Daten oft auch nicht so ist, wie die von dir beschriebene
Variante.)
>>>> Frage 4: wie werden
>>>> rationale Zahlen dargestellt (Punkt oder Komma? '1.0e+001'?)?
>>> Das interessiert CSV nicht. CSV kennt nur Zeichenfolgen.
>> Denjenigen, der die Daten nachbearbeiten will, interessiert das schon.
> Was meinst Du mit "nachbearbeiten"?
Eventuell meint er damit jemand der die Daten Auswerten muss.
>> Und das ist nicht ganz unwichtig. Wenn man mit Excel zum Beispiel eine
>> Datei importiert, die in einer Spalte sowas enth�lt
>> 01c3
>> 05ab
>> 0a32
>> 0e54
>> 10c9
>> 129c
>> wird eine Zelle davon den Wert 0 haben.
>
> Das hat aber nichts mit CSV zu tun, sondern mit Excel. Wenn diese Werte
> nicht als Zahlen, sondern als String interpretiert werden sollen, muss
> man sie entsprechend darstellen, damit auch Excel das erkennt.
Eben, das Problem ist ja gerade, dass es keine allgemein g�ltige
Definition f�r CSV-Daten gibt, und Excel das wieder anders
interpretiert, als z.b. durch deine Definition von CSV-Daten vorgegeben.
In Excel ist gerade nicht jede Spalte einfach ein Text, der nicht
weiter ausgewertet wird.
> http://www.wotsit.org/ bietet zum Thema CSV eine ZIP-Datei zum Download
> an, welches eine Textdatei mit der Beschreibung des CSV-Formats enth�lt.
Besser "dieses" CSV-Formates, in der Praxis hat sich der RFC anscheinend
noch nicht wirklich durchgehend durchgesetzt.
Tom
> On 23 Dez., 20:07, Claus Reibenstein <4spamerso...@kabelmail.de>
> wrote:
Immer diese Einleitungsromane ...
>> Genau hier liegt Dein Problem: "%s" liest grunds�tzlich bis zum n�chsten
>> Whitespace (Leerzeichen, Tabulator, Newline etc.). Versuch's mal mit
>> "%[^;]".
>
>> fscanf() sagt Dir �brigens immer, wie viele Werte erfolgreich eingelesen
>> wurden, und nicht nur EOF im Fehlerfall. Nutze dies.
>
> Hab ich probiert.
> Der String ar1_artbez wird jetzt richtig ausgegeben, jedoch nicht
> lip_diffme, lip_priorita.
> Ab dem 2. Datensatz rennt das Programm jetzt in eine Endlosschleife.
Der Fehler passiert schon beim ersten Datensatz. �ber den kommt er
n�mlich nicht hinaus:
> while((anz=fscanf(CSV,"%d;%d;%d;%d;%d;%[^;]%d,0;%d;\n",
^^^^^^^
Hier liest Dein Programm alle Zeichen, die kein Semikolon sind, und
versucht dann, das Semikolon als Zahl zu interpretieren, was nat�rlich
schief geht. Deshalb bekommst Du schon am Anfang nur eine 6
zur�ckgegeben statt der erwarteten 8. Leider behandelst Du diesen Fehler
jedoch nirgends, was dazu f�hrt, dass Dein Programm auf diesem Semikolon
bis zum Sankt-Nimmerleinstag h�ngen bleibt.
Abhilfe:
- Semikolon vor dem "%d" wieder einf�gen (warum hast Du das eigentlich
rausgeworfen?).
- Fehlerbehandlung einbauen.
> Hi,
>
> Claus Reibenstein wrote:
>
>> Stefan Reuther schrieb:
>>
>>> Claus Reibenstein wrote:
>>>
>>>> Das reicht bei Weitem nicht. Nach dieser Definition wären JPG, BMP, GIF,
>>>> MP3, WAV etc. ebenfalls Sprachen.
>>>
>>> Sind es doch?
>>
>> Nein. Es sind Dateiformate.
>
> Wenn ein Binärhaufen nach der von JPEG vorgegebenen Struktur im Speicher
> liegt (oder gar auf einem System, welches gar keine Dateien kennt), mithin
> also an keine Datei mehr gebunden ist: wie nennst du es dann?
Datenformat.
> Nur weil du den Begriff "Sprache" auf
> Programmiersprachen beschränkst
Wann und wo habe ich das getan?
> muss das nicht die ganze Welt so tun.
Weil die Informatiker so etwas als Sprache bezeichnen (was ich immer
noch nicht so recht glauben mag), muss das nicht die ganze Welt so tun.
>>>> Durch Verdopplung desselben:
>>>> "Geht nicht" gibt's nicht --> """Geht nicht"" gibt's nicht"
>>>
>>> Das ist eine häufige Möglichkeit, aber ich würde wetten, dass es bei
>>> weitem nicht die einzige ist.
>>
>> Diese Wette dürftest Du verlieren.
>
> Schon das Escaping dieser Zeichen in C ist ein Gegenbeispiel: "\"".
Was hat C mit CSV zu tun (vom Anfangsbuchstaben abgesehen)?
> Die Nachfragen von Stefan sind IMO schon berechtigt: was einem manchmal so
> als CSV über den Weg läuft kann die wildesten Konstrukte enthalten.
Das mag ja alles sein. Bei Ralf ging es aber um eine bestimmte Variante,
die am Beispiel zweifelsfrei zu erkennen war.
> Speziell
> das Escaping mittels \ habe ich schon hier und da gesehen.
Die Spezifikation kennt diese Form nicht.
Gruß. Claus
--
) )
(,) Ich wünsche allen Mitlesern (,)
Claus Reibenstein <4spame...@kabelmail.de> wrote:
> Markus Brueckner schrieb:
>> Claus Reibenstein wrote:
>>> Stefan Reuther schrieb:
>>>> Claus Reibenstein wrote:
>>>>> Das reicht bei Weitem nicht. Nach dieser Definition wären JPG, BMP, GIF,
>>>>> MP3, WAV etc. ebenfalls Sprachen.
>>>> Sind es doch?
>>> Nein. Es sind Dateiformate.
Der Informatiker sieht sie als "formale Sprachen", nicht weil der Begriff
"Datenformat" nicht zutreffend waere, sondern weil es oft zweckmaesig ist
(und teils die Implementierung eines "Parsers" fuer dieses Format erleich-
tert), wenn man dieses Format als "formale Sprache" auffasst und durch eine
"Grammatik" in einem standardisierten Format (z.B. BNF bzw. EBNF) formuliert.
>> Wenn ein Binärhaufen nach der von JPEG vorgegebenen Struktur im Speicher
>> liegt (oder gar auf einem System, welches gar keine Dateien kennt), mithin
>> also an keine Datei mehr gebunden ist: wie nennst du es dann?
> Datenformat.
... oder auch "formale Sprache" (diehe dazu auch den Wikipedia-Artikel zum
Begriff "formale Sprache").
> Weil die Informatiker so etwas als Sprache bezeichnen (was ich immer
> noch nicht so recht glauben mag),
Ist aber so.
> muss das nicht die ganze Welt so tun.
Ein Kleinkind verwendet auch ein anderes Vokabular als ein Gehirnchirurg,
das macht aber weder das Vokabular ds Kleinkinds noch das des Gehirnchi-
rurgen "falsch" oder "ungueltig" ...
>> Die Nachfragen von Stefan sind IMO schon berechtigt: was einem manchmal so
>> als CSV über den Weg läuft kann die wildesten Konstrukte enthalten.
> Das mag ja alles sein. Bei Ralf ging es aber um eine bestimmte Variante,
> die am Beispiel zweifelsfrei zu erkennen war.
Wirklich zweifelsfrei? Wo doch gar nicht alle "Sonderfaelle" in seinem
Beispiel vorkamen? Woher willst du wissen, dass seine Beispiele auch alle
Besonderheiten, die bei ihm auftreten koennten, auch schon enthielten?
Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)
--
Ein Domainname (auch wenn er Teil einer Mailadresse ist) ist nur ein Name,
nicht mehr und nicht weniger ...
> > while((anz=fscanf(CSV,"%d;%d;%d;%d;%d;%[^;]%d,0;%d;\n",
>
> ^^^^^^^
>
> Hier liest Dein Programm alle Zeichen, die kein Semikolon sind, und
> versucht dann, das Semikolon als Zahl zu interpretieren, was nat rlich
> schief geht. Deshalb bekommst Du schon am Anfang nur eine 6
> zur ckgegeben statt der erwarteten 8. Leider behandelst Du diesen Fehler
> jedoch nirgends, was dazu f hrt, dass Dein Programm auf diesem Semikolon
> bis zum Sankt-Nimmerleinstag h ngen bleibt.
>
> Abhilfe:
> - Semikolon vor dem "%d" wieder einf gen (warum hast Du das eigentlich
> rausgeworfen?).
> - Fehlerbehandlung einbauen.
So jetzt gehts
while((anz=fscanf(CSV,"%d;%d;%d;%d;%d;%[^;];%d,0;%d;\n",
Ich bin vorher davon ausgegangen, dass das Semikolon vor %[^;] das
Semikolon vor der Zahl representieren würde.
Danke für die Hilfe.
Gruss
Ralf
=>
Anzahl:8
lip_liefwo:20091110
lip_bestterm:20091106
lip_wtermin:20090713
lip_aufnr:11090365
lip_kunde:640
ar1_artbez:Vorlage Baugruppen
lip_diffme:1
lip_priorita:50
Anzahl:8
lip_liefwo:20091110
lip_bestterm:20091106
lip_wtermin:20090713
lip_aufnr:11090365
lip_kunde:640
ar1_artbez:VorlageBaugruppen
lip_diffme:1
lip_priorita:50
Anzahl:8
lip_liefwo:20091111
lip_bestterm:20091109
lip_wtermin:20091111
lip_aufnr:11090644
lip_kunde:556
ar1_artbez:a_grlitzskalarbasiccomada
lip_diffme:5
lip_priorita:50
Thomas Koller wrote:
> Markus Brueckner <ne...@slash-me.net> wrote:
> [...]
>> Wenn ein Binärhaufen nach der von JPEG vorgegebenen Struktur im Speicher
>> liegt (oder gar auf einem System, welches gar keine Dateien kennt),
>> mithin also an keine Datei mehr gebunden ist: wie nennst du es dann?
>
> Datenformat?
Geh ich sogar mit. Natürliche Sprache ist da ja durchaus vielseitig.
>> Hint: für den
>> Informatiker ist es immernoch ein Wort der durch die Grammatik von JPEG
>> definierten Sprache.
>
> Kommt drauf an was du unter "Informatiker" genau verstehst. Vielleicht
> die Leute auf der Uni, vor allem die Theoretiker, aber von den Leuten
> die praktisch mit solchen Formaten arbeiten kenn ich keinen der sowas
> "Sprache" nennt.
Prinzipiell verstehe ich unter Informatiker solche, die kraft ihres
Abschlusses so heißen. Die haben dann auch im allgemeinen was vom Begriff
"Sprache" in dem Zusammenhang gehört. In der Praxis hast du recht: da wird
kaum einer von einer Sprache sprechen, sondern wirklich erstmal von einem
Daten- oder Dateiformat. Interessant wird die theoretische Genauigkeit erst
dann, wenn die Daten komplexer strukturiert sind, als bei CSV. Schon bei
einer einfachen Sache, wie einer Gleichung mit den 4 Grundrechenarten hilft
der theoretische Überbau ganz gewaltig.
>> Nur weil du den Begriff "Sprache" auf
>> Programmiersprachen beschränkst muss das nicht die ganze Welt so tun.
>
> Wieso auf "Programmiersprachen" beschränkt? Ich geh davon aus dass er
> deutsch ohne weitere Diskussion auch als Sprache bezeichnet.
Ist mir hinterher auch aufgefallen.
> Aber nur weil du solche Datenformate als Sprachen bezeichnest, muss das
> nicht die ganze Welt so tun.
Ich bezeichne solche Datenformate üblicherweise als Datenformate, keine
Angst. Allerdings bin ich mir der theoretischen Hintergründe und
Möglichkeiten bewußt. Von dieser Warte aus habe ich Stefan Reuthers Reaktion
auf das "triviale, intuitiv erfassbare Datenformat" durchaus verstanden.
Auch wenn ich kurz schmunzeln musste, als Stefan Ram CSV erstmal formal
definieren wollte. Hier ist es wohl in der Tat einfach, einfach ein
zeilenweises strtok draufzuwerfen. Man sollte halt nur wissen, wo man
weitergehen kann, wenn das aufgrund der Komplexität des Datenformats/der
Sprache dann scheitert.
Bis dann
Markus, jetzt wieder lurkend
--
die tonne scheisst auf dein smilie, vor
der tonne sind wir alle gleich.
- hoosiak in fem.flame
Wo ist der Unterschied zu "Sprache"?
>>Damit handelt es sich schon mal nicht um ein eindeutiges Format, sondern
>>eine Formatfamilie, weil die Amis ein anderes Trennzeichen benutzen als
>>die Deutschen. Man kann auch Tabs oder Doppelpunkte nutzen.
>
> Ja. Und? Der Poster hat ein Beispiel gepostet, an welchem _eindeutig_ zu
> erkennen ist, welches Trennzeichen bei ihm tats�chlich Verwendung
> findet. Man muss schon _sehr_ blind sein, um das nicht zu erkennen.
Korrekt, das Trennzeichen ist erkennbar. Was ist mit dem Dezimaltrenner?
Textbegrenzer & dazugeh�rige Regeln? Die waren darin nicht erkennbar.
>>>>Frage 3: sollte das Problem von Frage 2
>>>>durch Anf�hrungszeichen oder Escapezeichen gel�st werden, wie wird ein
>>>>Anf�hrungszeichen oder Escapezeichen dargestellt?
>>>
>>>Durch Verdopplung desselben:
>>> "Geht nicht" gibt's nicht --> """Geht nicht"" gibt's nicht"
>>
>>Das ist eine h�ufige M�glichkeit, aber ich w�rde wetten, dass es bei
>>weitem nicht die einzige ist.
>
> Diese Wette d�rftest Du verlieren.
Die Herausforderung nehme ich an. Um zu gewinnen, musst du n�mlich jetzt
einen Nichtexistenzbeweis f�hren, das geht nur durch Aufz�hlung wirklich
*aller* auf diesem Planeten verwendeten Varianten von CSV.
>>>>Frage 4: wie werden
>>>>rationale Zahlen dargestellt (Punkt oder Komma? '1.0e+001'?)?
>>>
>>>Das interessiert CSV nicht. CSV kennt nur Zeichenfolgen.
>>
>>Denjenigen, der die Daten nachbearbeiten will, interessiert das schon.
>
> Was meinst Du mit "nachbearbeiten"?
Wir lesen CSV nicht zum Selbstzweck, und der OP hatte da "%d"
drinstehen, also will er wohl Zahlen haben.
>>Und das ist nicht ganz unwichtig. Wenn man mit Excel zum Beispiel eine
>>Datei importiert, die in einer Spalte sowas enth�lt
>> 01c3
>> 05ab
>> 0a32
>> 0e54
>> 10c9
>> 129c
>>wird eine Zelle davon den Wert 0 haben.
>
> Das hat aber nichts mit CSV zu tun, sondern mit Excel. Wenn diese Werte
> nicht als Zahlen, sondern als String interpretiert werden sollen, muss
> man sie entsprechend darstellen, damit auch Excel das erkennt.
Da w�ren wir wieder bei programmspezifischen Sonderlocken. '="0e54"' in
die Zelle zu schreiben hilft z.B., widerspricht aber z.B. dem RFC.
>>Okay, inzwischen gibt es einen RFC zu CSV (#4180).
>
> Kannte ich noch nicht. Best�tigt aber meine Annahmen.
>
> http://www.wotsit.org/ bietet zum Thema CSV eine ZIP-Datei zum Download
> an, welches eine Textdatei mit der Beschreibung des CSV-Formats enth�lt.
Das ist eine von vielen m�glichen Beschreibungen eines CSV genannten
Dateiformates. Das ist genausowenig offiziell wie alles, was ich hier
schreibe. (Allerdings spezifiziert es das Dateiformat CSV als Wort einer
Grammatik, also als Sprache. Und es nutzt "," als Feldtrenner, ist also
f�r die Daten des OP schon mal definitiv unbrauchbar.)
Stefan
Natürlich ist das ein Datenformat. Es gehorcht gewissen Regeln. Diese
Regeln entsprechen vom Stil her denen, die man auch zur Beschreibung von
z.B. Programmiersprachen verwendet. Man kann also die gleichen
Formalismen dafür benutzen. Oftmals ist das nicht nötig, weil Daten-
formate üblicherweise auf Einfachheit getrimmt sind, und somit mit
relativ einfachen Mitteln interpretierbar sind. Man braucht also keine
Algorithmen aus dem Drachenbuch, um das Endesymbol eines Feldeintrages
zu finden. Aber schaden tut's nicht.
Und natürlich nennt im Normalfall niemand z.B. das MPEG4-File-Format
"Sprache", allerdings nennt im Normalfall auch niemand ein C-Programm
ein "Wort", obwohl es sprachtheoretisch ein Wort der Sprache "C" ist.
Und man parst MPEG4FF am kleversten mittels Lexer und recursive-
descent-parser, genauso wie z.B. C.
>>Die Nachfragen von Stefan sind IMO schon berechtigt: was einem manchmal so
>>als CSV über den Weg läuft kann die wildesten Konstrukte enthalten.
>
> Das mag ja alles sein. Bei Ralf ging es aber um eine bestimmte Variante,
> die am Beispiel zweifelsfrei zu erkennen war.
Nein, denn genau die Randfälle waren eben daran nicht erkennbar.
>>Speziell
>>das Escaping mittels \ habe ich schon hier und da gesehen.
>
> Die Spezifikation kennt diese Form nicht.
*Welche* Spezifikation? Irgendein fischiges Dokument von wotsit.org
zählt da genausowenig wie ein RFC, an den man sich halten kann oder auch
nicht.
Stefan
> Ob man jetzt gleich mit einer formalen Grammatik auf CSV einklopfen muss sei
> mal dahingestellt.
> Ich bezeichne solche Datenformate ᅵblicherweise als Datenformate, keine
> Angst. Allerdings bin ich mir der theoretischen Hintergrᅵnde und
> Mᅵglichkeiten bewuᅵt. Von dieser Warte aus habe ich Stefan Reuthers
> Reaktion
> auf das "triviale, intuitiv erfassbare Datenformat" durchaus verstanden.
> Auch wenn ich kurz schmunzeln musste, als Stefan Ram CSV erstmal formal
> definieren wollte. Hier ist es wohl in der Tat einfach, einfach ein
> zeilenweises strtok draufzuwerfen. Man sollte halt nur wissen, wo man
> weitergehen kann, wenn das aufgrund der Komplexitᅵt des Datenformats/der
> Sprache dann scheitert.
man sollte sich auch drᅵber klar werden, an welchen Punkten die empfohlenen
Werkzeuge versagen.
Um vernᅵnftig Datensᅵtze zu zerlegen, die auch leere Elemente enthalten
kᅵnnen, ist strtok absolut ungeeignet, da jede Gruppe von Trennern wie
nur ein einziger Trenner gewertet werden.
Um auch leere Datenelemente korrekt ermitteln zu kᅵnnen, muᅵ man auf
Posix-Funktionen zurᅵckgreifen, die ihren Weg in den Standard noch nicht
gefunden haben.
Franz
--
Erstellt mit Operas revolutionᅵrem E-Mail-Modul: http://www.opera.com/mail/
Wieso das denn? Man kann doch auch einfach über den Datensatz iterieren,
oder etwa nicht? Marke
field_num = 0;
act_on_field(0, buf, 0);
for (int i = 0; i < strlen(buf); i++)
{
if (buf[i] == ';')
{
field_num++;
act_on_field(field_num, buf, i);
}
}
wobei act_on_field eine Funktion ist, die auch bloß bis zum nächsten
Semikolon geht, und dabei irgendwas mit den Daten des Feldes tut (man
hat ja einen Grund, die CSV-Datei einzulesen. Man tut das ja nicht um
die CPU zu beschäftigen).
> Franz
Tschö,
Markus
--
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.
-- gUnter nanonüm in de.alt.anime
--- news://freenews.netfront.net/ - complaints: ne...@netfront.net ---
>>> Hier ist es wohl in der Tat einfach, einfach ein
>>> zeilenweises strtok draufzuwerfen. ...
>> man sollte sich auch drᅵber klar werden, an welchen Punkten die
>> empfohlenen Werkzeuge versagen.
>> Um vernᅵnftig Datensᅵtze zu zerlegen, die auch leere Elemente enthalten
>> kᅵnnen, ist strtok absolut ungeeignet, ...
> Man kann doch auch einfach ᅵber den Datensatz iterieren,
> oder etwa nicht?
das ist mit anderen Worten genau das, was ich oben behauptet hatte:
das ganz oben empfohlene Weg ᅵber strtok ist nur im Idealfall geeignet.