Lesen Werte aus CSV Datei in Variablen
Ich versuche zu schreiben, ein einfaches Stück code, das Lesen von Werten aus einer CSV-Datei mit maximal 100 Einträge in ein array von structs.
Beispiel für eine Zeile der CSV-Datei:
1,Mr,James Quigley,Director,200000,0
Ich verwende den folgenden code in die lese-Werte, aber wenn ich drucken Sie die Werte, die Sie falsch sind
for(i = 0; i < 3; i++) /*just assuming number of entries here to demonstrate problem*/
{
fscanf(f, "%d,%s,%s,%s,%s,%d,%d", &inArray[i].ID, inArray[i].salutation, inArray[i].firstName, inArray[i].surName, inArray[i].position, &inArray[i].sal, &inArray[i].deleted);
}
Dann, wenn ich drucken der ersten Namen, die Werte sind jeweils der erste name:
for(j = 0; j < 3; j++) /* test by printing values*/
{
printf("Employee name is %s\n", inArray[j].firstName);
}
Gibt ames,Quigley,Director,200000,0
und so weiter auf diese Weise. Ich bin sicher, dass es ist, wie ich das format der fscanf Linie ist, aber ich kann nicht ankommen es zu wirken.
Hier ist meine Struktur bin ich beim Lesen in:
typedef struct Employee
{
int ID;
char salutation[4];
char firstName[21];
char surName[31];
char position[16];
int sal;
int deleted;
} Employee;
%s
ist gierig, denke ich, und liest es ein Wort... Er findet die%d
, des ganzzahligen Teils, dann die,
, und dann hat es zu Lesen, einen string.,
ist gültig in einem string, so liest es bis zum Ende der Zeile (es ist kein Platz, bis dann), nicht bis zum ersten Komma... Und der rest bleibt leer. (Aus dieser Antwort)- Du hast eine firstN und Vorname in der Buchung - was ist das? Kannst du die Struktur so gut?
- Korrigiert die var-Namen und fügte hinzu, struct
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, da ein string
%s
enthalten kann, die durch Kommas, damit es gescannt wird in dem ersten string. Es gibt keine "look-ahead" in derscanf()
Formatierung Planer, die Tatsache, dass die%s
ist, gefolgt von einem Komma in der format-Spezifikation string bedeutet nichts.Zeichen Gruppen (Suche das Handbuch für [).
Lernen und zu überprüfen Sie den Rückgabewert, da I/O-Aufrufe fehlschlagen kann! Verlassen Sie sich nicht auf die Daten, Gültigkeit, es sei denn
got
7.Damit das Programm die gesamte Datei zu Lesen (mehrere Datensätze, d.h. Zeilen), würde ich empfehlen das laden auch ganze Zeilen in eine (große) fixed-size-buffer mit
fgets()
, dann mitsscanf()
auf, dass die Puffer analysiert die Werte in der Spalte. Das ist wesentlich einfacher und wird sicherstellen, dass Sie wirklich Scannen separaten Zeilen, den Aufruffscanf()
in einer Schleife nicht, dafscanf()
ein Zeilenvorschub ist nur whitespace.Könnte genauso gut nach meinen Kommentar als Antwort:
%s
liest eine volle word standardmäßig.Findet er es
%d
, des ganzzahligen Teils, dann die,
, und dann hat es zu Lesen, einen string.,
als gültig betrachtet wird in ein Wort (es ist nicht für ein Leerzeichen), so liest es bis zum Ende der Zeile (es gibt keine Leerzeichen, bis dann), nicht bis zum ersten Komma... Und der rest bleibt leer. (Aus dieser Antwort)Müssen Sie das Trennzeichen ändern, das mit der Angabe einer regex:
Statt
%s
verwenden%[^,]
, was bedeutet, "greifen alle chars, und stoppen Sie, wenn gefunden, eine,
".BEARBEITEN
%[^,]s
schlecht ist, bräuchte es ein literals
nach dem Ende der scanset... Danke @MichaelPotter(Aus Ändern der scanf () - Trennzeichen und Lesen Werte aus CSV Datei in Variablen )