Der beste Weg, um mit begrenzten Dateien umzugehen

16

In der Regel verwendet eine CSV-Datei ein Komma und das Rückgabezeichen als Feld- und Zeilenbegrenzer.

Dies führt zu offensichtlichen Problemen mit Text, der beide Zeichen enthalten kann.

Natürlich gibt es dort Optionen (die ihnen entgehen), aber wie gehen die Leute damit um? Benutze verschiedene Charaktere - Pfeifen oder Tildas? Ihnen entkommen? Verwenden Sie keine durch Trennzeichen getrennten Dateien, es ist doch 2010 und wir haben jetzt XML?

Suchen Sie zumindest nach einer anständigen Chance, keine Probleme zu sehen.

(Nur um klar zu sein, dies ist eher eine Frage der Neugier als etwas Beständigeres. Ich habe immer wieder mit Daten gespielt, bin immer wieder darauf gekommen, aber normalerweise fühlt es sich ein bisschen, na ja, dreckig an.) und fragte mich, was die Erfahrung anderer Leute war).

Jon Hopkins
quelle
Überlegen Sie genau, ob Sie CSV verwenden möchten - es ist nett und einfach zu handhaben (siehe Antworten für allgemeine Escape-Regeln), aber es ist bei weitem nicht so kompatibel, wie es sein sollte - wenn Sie nur mit Ihren eigenen Programmen kommunizieren, ist es in Ordnung, aber wenn Sie Woanders importieren wollen, wird es etwas merkwürdig, weil verschiedene Programme unterschiedliche Escape-Regeln befolgen.
Michael Kohne
@ Michael - Auf jeden Fall. Das Problem ist jedoch, dass es so allgegenwärtig ist, dass Sie fast immer auf die Idee kommen, wenn es sich um eine sehr verlockende Option handelt. Bei vielen älteren Systemen ist dies die einzige Option.
Jon Hopkins
Ältere Bibliotheken existieren in vielen Sprachen (mit Sicherheit die üblichen) zum Lesen und Schreiben von durch Zeichen getrennten Dateien. Sie werden mit fast jeder Situation fertig. Das Schreiben eines eigenen CSV-Parsers scheint eine verbreitete Art von Anti-Pattern zu sein.
Quentin-Starin

Antworten:

13

Laut Wikipedia :

Felder mit eingebetteten Kommas müssen in doppelte Anführungszeichen eingeschlossen werden.

Und außerdem:

Felder mit eingebetteten doppelten Anführungszeichen müssen in doppelte Anführungszeichen eingeschlossen werden, und jedes der eingebetteten doppelten Anführungszeichen muss durch ein Paar doppelter Anführungszeichen dargestellt werden.

Ich weiß nicht, wer das erfunden hat, aber es zeigt, dass man irgendwann fliehen muss. Es ist die einzige feste Lösung. Alles andere ist nur Klebeband über Klebeband: Vielleicht funktioniert es erst einmal, aber irgendwann werden Sie auf einen Fall stoßen, in dem Sie eine Ausnahme benötigen, von einer Ausnahme abgesehen, und es dauert nicht lange, bis Ihr Regelwerk funktioniert ist weitaus komplexer als eine einfache Fluchtzeichenlösung.

Es scheint, dass CSV-Ersteller zuerst versuchten, Kommas zu vermeiden, indem sie eine spezielle Syntax in doppelten Anführungszeichen einführten, die das Speichern von Kommas ermöglichte, aber dann wollte jemand auch Zeichen in doppelten Anführungszeichen speichern, also mussten sie an diesem Punkt fliehen - lustigerweise mit der Anführungszeichen als Escape-Zeichen. Hätten sie beschlossen, erst richtig zu fliehen, wäre die Syntax jetzt einfacher.

Joonas Pulakka
quelle
3
Was sollte und was ist .. unterscheidet sich oft :)
Tim Post
Ich finde die Lösung ganz ok. Für einfache Daten funktioniert CSV einwandfrei, für komplexe Daten ist ein Zitieren erforderlich, und ein "" Ausweichen mit Spuren "" geht auf BASIC zurück.
Ernelli
1
@Ernelli: Nun, da ich mehr darüber nachdenke, kann es tatsächlich ein vernünftiger Kompromiss zwischen Lesbarkeit und Einfachheit sein. Das Problem ist, dass es für Menschen hässlich aussieht , obwohl es für den Computer trivial ist, es zu analysieren. Das Reservieren von Escape-Zeichen nur in seltenen Fällen ("Felder mit eingebetteten doppelten Anführungszeichen") führt zu einer Ausgabe, die normalerweise für den Menschen gut lesbar erscheint. Dies ist eine gute Lösung, vorausgesetzt, Kommas in Feldnamen werden häufiger verwendet als doppelte Anführungszeichen in Feldnamen.
Joonas Pulakka
2

Ich gehe davon aus, dass Sie so etwas haben:

Foo,Baz,,,"Foo,Baz"

Wenn Zeichenfolgen , die das Trennzeichen enthalten , werden nicht notiert oder entkommen, haben Sie keine wirkliche zuverlässige Möglichkeit , die Datei zu parsen.

Sie können die Daten jedoch untersuchen, um sie zu analysieren und Schlussfolgerungen zu ziehen:

  • Kommagetrennte Floats sollten als Zeichenfolge behandelt werden
  • Wenn die Zeile davor oder danach weniger Trennzeichen enthält, überspringen Sie das Parsen dieser Zeile und protokollieren Sie sie
  • Behandle 'wie "

Sie müssen einen Parser schreiben, um solche Dinge zu handhaben, aber es muss nicht kompliziert sein.

Nach meiner Erfahrung führt der Import von massiven Speicherauszügen aus Excel immer dazu, dass Sie zurückgehen und einige Sonderbälle überprüfen müssen. Ihre Herausforderung ist Ihrem Programm zu geben , gerade genug gesunden Menschenverstand in Bezug auf die Daten , so dass es nicht einen verrückten Einsatz macht. Dann überprüfen Sie, was protokolliert wurde und waschen / spülen / wiederholen.

Ich habe einmal eine interne FAQ für eine kleine Firma bearbeitet, die alle Ubuntu-Workstations verwendet. Ein Teil der FAQ gab 'Shell-Shortcuts' an, und es kam zu mir Pipe-abgegrenzt. Nun, die Antworten waren in der Regel auch durch Pipe-Trennzeichen (dh grep foo | something) getrennt und wurden weder zitiert noch geflüchtet. Ich fühle diesen Schmerz :)

Tim Post
quelle
2

An CSV ist bis zu einem gewissen Punkt nichts auszusetzen

CSV eignet sich gut für fest definierte Daten, deren Format sich wahrscheinlich nicht ändert und die den Empfänger-Parser nicht überraschen.

Hier ist eine handliche Liste der großen Fallstricke:

  1. Escapezeichen innerhalb von (Feld enthält Feldbegrenzer)
  2. "" s enthalten CRLFs (Feld enthält Zeilenbegrenzer)
  3. Unicode (zugrunde liegendes Textformat ist möglicherweise nicht ausreichend)
  4. Unterschiedliche Leitungsabschlusszeichen für unterschiedliche Betriebssysteme (ist CR oder CRLF oder LF oder NUL?)
  5. Inline-Kommentare (Zeile mit dem Präfix #, //, -,; usw.)
  6. Versionsverwaltung (die neueste Version der Datei enthält mehr oder weniger Felder)
  7. Unterscheidung zwischen NULL und leeren Daten (, "", ist leer, aber ,, ist null?)

Sie könnten dies mit einem Metadaten-Header angehen, der beschreibt, wie die Felder analysiert werden sollen, aber Sie können auch einfach XML verwenden. Es ist wegen dieser Art von Freiform-CSV-Chaos, dass es erfunden wurde. Der XML-Ansatz scheint einfach zu schwer zu sein, als dass er ein einfaches Problem darstellen könnte.

Eine beliebte Alternative ist die Strategie "Weird Character Delimiter". Dies umgeht viele der oben genannten Probleme, da Sie so etwas wie ein | verwenden (Pipe-) Zeichen für die Feldbegrenzung und eine CRLF für die Datensatzbeendigung. Das Problem mit mehrzeiligen Feldern wird dadurch nicht umgangen (es sei denn, Sie verwenden einen Feldzähler), aber Sie erhalten gut formatierte Zeilen für Menschen.

Wenn Sie nur nach einer einfachen Möglichkeit suchen, mit solchen Dateien umzugehen , können Sie in der Java-Welt einfach OpenCSV darauf werfen . Auf diese Weise abstrahieren Sie alle Probleme in einem festgelegten Rahmen.

Gary Rowe
quelle
2

CSV ist in vielen Situationen immer noch ein gültiges Format, zumal es für Kunden immer noch die einfachste Möglichkeit ist, Daten zu schreiben, die in Ihre Anwendung importiert werden müssen. Nur wenige unserer Kunden beschäftigen sich gerne mit XML, vielleicht weil es sehr ausführlich ist und all diese "beängstigenden" spitzen Klammern hat. Es ist so viel einfacher für sie, ihre Gehirne um eine einfache Liste von Gegenständen zu wickeln, die durch ein vereinbartes Zeichen getrennt sind, und zuzustimmen, dass dasselbe Zeichen im Inhalt eines Feldes nicht zulässig ist.

Das heißt, Sie müssen die Eingabe immer noch korrekt verarbeiten und nach Situationen suchen, in denen ungültige Zeichen verwendet werden. Ich habe begonnen, FileHelpers für meine CSV-Parsing-Anforderungen zu verwenden.

Dave
quelle
1

Ich halte mich normalerweise an die Norm und entkomme ihnen. In den meisten Programmiersprachen gibt es eine gute eingebaute Unterstützung oder eine gute Bibliothek.

Es hängt von der Situation ab, welches Format verwendet wird, und CSV ist ein vernünftiges Format zum Austauschen einfacher Datenformatstrukturen.

Salandur
quelle
0

Vergessen Sie CSV, verwenden Sie JSON . Leicht zu schreiben, leicht zu analysieren. XML ist so 2005 .

user281377
quelle
6
und hat das gleiche Problem, wenn Sie ein Zeichen verwenden möchten, das Teil des JSON-Formats ist (wie {oder,)
Salandur
Salandur: Überhaupt nicht! Es gibt genaue Regeln, wie man entkommt! Aber {und, müssen nicht einmal entkommen werden, denn drinnen sind Schnüre, sie sind nicht mehrdeutig!
user281377
1
Schön und gut, aber ich kann mich nicht erinnern, dass Excel eine "Export to JSON" -Funktion hat :) Es gibt Zeiten, in denen Sie seltsame Dinge analysieren müssen, um sie in ein angenehmeres Format zu bringen.
Tim Post
1
Und JSON ist einfach so genial, wenn es darum geht, eine Million Objekte derselben Form zu übergeben. Oh, Moment mal.
Frank Shearar
1
JSON bietet in Bezug auf diese Frage keine Verbesserung gegenüber CSV und mangelt es entscheidend an Interoperabilität mit vielen Anwendungen (wie bereits erwähnt, kann es nicht aus Office, SQL-DBs usw. importiert oder exportiert werden). JSON eignet sich hervorragend für interne, kompakte clientseitige Vorgänge, XML ist jedoch für die Übertragung von Daten zwischen Anwendungen wesentlich besser.
Dan Diplo
0

Normalerweise bekomme ich statt einer CSV-Datei eine TSV-Datei (durch Tabulatoren getrennte Werte), ziehe die Datei in Emacs und finde heraus, welches der wenigen seltenen Zeichen NIEMALS verwendet wird ($ ist normalerweise eine gute Wahl). und dann konvertiere ich alle tabs in $.

Von dort aus kann GNU AWK angewiesen werden, $ als Feldtrennzeichen zu verwenden, und Bob ist Ihr Onkel.

John R. Strohm
quelle