Ich lese eine CSV-Datei und möchte jede Zeile in mehrere verschiedene Variablen aufteilen. Ich habe über Strtok, einige Leute empfehlen es, andere sagen, es ist problematisch. Gibt es eine andere Methode, meine Saiten zu spalten?Gibt es eine andere Möglichkeit, eine Zeichenfolge mit einem Komma-Trennzeichen neben Strtok zu teilen?
Antwort
Um CSV-Quellzeilen zu analysieren, müssen Sie die Syntax für "
getrennte Zeichenfolgen verarbeiten, die ,
Zeichen einbetten können. Sie können strtok()
nicht direkt verwenden. Außerdem betrachtet strtok()
Sequenzen von Trennzeichen als einem einzelnen Trennzeichen gleichwertig, was definitiv nicht das ist, was Sie für das Trennzeichen ,
wollen.
Ich fürchte, Sie müssen einen Parser von Hand schreiben, durch die CSV-Zeilen iterieren, vorzugsweise in einen großen Puffer lesen und eine Art von Zustandsmaschine verwenden.
Sie können strchr
das Delimeter in einer Schleife und etwas mit jedem Segment tun.
Z. B. werden diese Argumente auf Kommas aufgeteilt und jedes Feld drucken:
int main(int argc, char** argv)
{
for(int i = 1; i<argc; i++){
char const *p0,*p1;
for(p0=argv[i]; (p1=strchr(p0,',')); p0=p1+1){
fwrite(p0,p1-p0,1,stdout); puts("");
}
fwrite(p0,strlen(p0),1,stdout); puts("");
}
}
Es ist ziemlich einfach.
'strchr()' ist * besser * als 'strtok()', aber Sie können '' 'getrennte Strings mit dieser Funktion immer noch nicht verarbeiten – chqrlie
@chqrlie Sicher, und Sie haben das gut beantwortet. Ich versuche im Allgemeinen nur den Kern von Fragen statt zu versuchen, herauszufinden, was das OP wirklich braucht, ich persönlich denke, es ist besser für die Website. – PSkocik
- 1. eine andere Möglichkeit neben ClickOnce zu veröffentlichen?
- 2. Gibt es eine integrierte Möglichkeit, Strings in C++ zu teilen?
- 3. Gibt es eine Möglichkeit, Objekt zwischen PHP-Seiten zu teilen?
- 4. Gibt es eine bessere Möglichkeit, diese Zeichenfolge mit LINQ zu teilen?
- 5. Gibt es eine bessere Möglichkeit, eine Zeichenfolge mehrmals zu suchen?
- 6. Gibt es eine Möglichkeit, einen InputStream zu teilen?
- 7. Gibt es eine Möglichkeit, Token in C zu zählen?
- 8. Gibt es eine Möglichkeit, Konfigurationsdaten zwischen eckigen Komponenten zu teilen?
- 9. Gibt es eine andere einfachere Möglichkeit, dieses Programm zu schreiben?
- 10. Gibt es eine andere Möglichkeit, Enum-Bitfelder zu testen?
- 11. Gibt es eine Möglichkeit, eine IOS App als Build für eine andere App zu erstellen?
- 12. Python: Gibt es eine Möglichkeit, eine Zeichenfolge mit nur ausgewählten Zeichen in der Zeichenfolge zu sortieren?
- 13. Lesen der Datei mit Kommatrennzeichen mit fgets() und strtok()
- 14. Gibt es eine andere Möglichkeit, Repaint() in Java zu tun?
- 15. Objektorientierte Programmierung: Gibt es eine andere Möglichkeit, Objekte zu erstellen?
- 16. Gibt es eine Möglichkeit, einer Objekteigenschaft eine mehrzeilige Zeichenfolge zuzuweisen?
- 17. Gibt es eine Möglichkeit, die Pixellänge einer Zeichenfolge zu berechnen?
- 18. Gibt es eine Möglichkeit, eine Sperre (z. B. eine Sperrdatei) zwischen R-Prozessen zu teilen?
- 19. Gibt es eine Möglichkeit, den aktuellen Plan programmatisch mit einem definierten Benutzer zu teilen?
- 20. Gibt es eine Möglichkeit, eine synchrone XHR-Anfrage zu fälschen?
- 21. Gibt es eine bessere Möglichkeit, dieser Zeichenfolge zu entkommen?
- 22. Gibt es eine Möglichkeit, eine Bilddatei mit fabric.js zu importieren?
- 23. Gibt es eine andere Möglichkeit, eine andere formale Sprache als Grammatiken zu beschreiben?
- 24. Gibt es eine Möglichkeit, eine Zeichenfolge in Node.js regexp-Anführungszeichen?
- 25. Gibt es neben Mono auch eine Möglichkeit, Microsoft .NET auf einem Mac oder Linux zu betreiben?
- 26. Gibt es eine Möglichkeit, Selektoren zu gruppieren?
- 27. Gibt es eine Möglichkeit, django.db.connection.queries zu löschen?
- 28. Gibt es eine Möglichkeit Tastatureingaben zu simulieren?
- 29. Gibt es eine nette Möglichkeit, eine (möglicherweise) lange Zeichenkette zu teilen, ohne in Python in Wörter zu teilen?
- 30. Gibt es eine Möglichkeit, auf einem Home Widget zu animieren?
Was meinst du mit "besser". –
@ErikGodard Von besser, ich meine etwas mehr akzeptiert. Wie ich schon sagte, manche Leute empfehlen strtok nicht, also suche ich etwas "sicherer". – Jasmine
Verwenden Sie eine Fremdanbieterbibliothek. Werfen Sie einen Blick auf die Antworten auf diese Frage für ein paar Empfehlungen: [CSV-Datei in C parsen] (http://stackoverflow.com/questions/14115529/parse-csv-file-in-c) – DaoWen