Warum ist ein Komma ein fehlerhaftes Trennzeichen / Trennzeichen in CSV-Dateien?

32

Ich habe diesen Artikel gelesen und bin gespannt auf die richtige Antwort auf diese Frage.

Das einzige, was mir in den Sinn kommt, ist vielleicht, dass in einigen Ländern das Dezimaltrennzeichen ein Komma ist und es Probleme beim Austausch von Daten in CSV geben kann , aber ich bin mir meiner Antwort nicht ganz sicher.

David Gasquez
quelle
6
Fast jedes Trennzeichen ist besser als ein Komma. Der Grund dafür ist, dass beim Einlesen von durch Kommas getrennten Dateien in einige Datenanalyse-Tools Kommas mit Interpunktionszeichen verwechselt werden können, wodurch das "Layout" der Felder oder Spalten gestört wird.
Mike Hunter
33
Ein Zyniker, der bemerkt, dass dieser Artikel ein SAS-Puff-Teil ist, könnte vermuten, dass SAS möglicherweise Probleme mit der Verarbeitung von CSV-Dateien mit Kommas hat :-).
whuber
3
@whuber - SAS kann (meiner Erfahrung nach) mit CSV-Dateien zu kämpfen haben, unabhängig davon, ob sie Kommas enthalten oder nicht, und erfordert für jede seltsame Sache, die SAS nicht mag, eine Menge Handcodierung.
Jeremy Miles
8
Die Suche nach immer undurchsichtiger werdenden Trennzeichen - Rohren, Pilgern, Dornen - ist verzweifelt. Dies legt nahe, dass die Vereinbarung und Einhaltung eines Standards die einzig sichere Möglichkeit ist, Daten in abgegrenzten Textdateien auszutauschen. Und ein universeller Standard muss die Darstellung beliebiger Textzeichenfolgen zulassen (wie RFC4180), anstatt sich auf die Annahme zu verlassen, dass einige nicht sein müssen und für andere Aufgaben verwendet werden können.
Scortchi
2
(a) Ich habe oft CSV-Dateien erfolgreich importiert. (b) Ich rate Leuten, .csv nicht zu verwenden, wenn ihre Daten Kommas enthalten. Diese widersprechen sich nicht. Es ist bedauerlich, dass (b) in einigen Bereichen einer Erklärung bedarf.
Nick Cox

Antworten:

33

Die Spezifikation des CSV-Formats ist in RFC 4180 definiert . Diese Spezifikation wurde veröffentlicht, weil

Es gibt keine formale Spezifikation, die eine Vielzahl von Interpretationen von CSV-Dateien ermöglicht

Leider hat sich seit 2005 (Datum der Veröffentlichung des RFC) nichts geändert. Wir haben noch eine Vielzahl von Implementierungen. Der in RFC 4180 definierte allgemeine Ansatz besteht darin, Felder, die Zeichen wie Kommas enthalten, in Anführungszeichen zu setzen. Diese Empfehlung wird jedoch nicht immer von unterschiedlicher Software erfüllt.

Das Problem ist, dass in verschiedenen europäischen Gebietsschemata das Komma als Dezimaltrennzeichen verwendet wird, sodass Sie 0,005anstelle von schreiben 0.005. In anderen Fällen werden Kommas anstelle von Leerzeichen verwendet, um z. B. Zifferngruppen zu kennzeichnen 4,000,000.00(siehe hier ). In beiden Fällen würde die Verwendung von Kommas möglicherweise zu Fehlern beim Lesen von Daten aus CSV-Dateien führen, da Ihre Software nicht genau weiß, ob 0,005, 0,1es sich um zwei oder vier verschiedene Zahlen handelt (siehe Beispiel hier ).

Last but not least, wenn Sie Text in Ihrer Datendatei speichern, sind Kommas in Text viel häufiger als beispielsweise Semikolons. Wenn Ihr Text also nicht in Anführungszeichen eingeschlossen ist, können solche Daten auch leicht mit Fehlern gelesen werden .

Nichts macht Kommas besser oder schlechter als Feldtrennzeichen , sofern CSV-Dateien gemäß Empfehlungen wie RFC 4180 verwendet werden, die vor den oben beschriebenen Problemen schützen. Wenn jedoch die Gefahr besteht, dass das vereinfachte CSV-Format Felder in Anführungszeichen nicht einschließt oder die Empfehlung inkonsistent verwendet wird, sind andere Trennzeichen (z. B. Semikolon) sicherer.

Tim
quelle
6
Nun, jede Software, die den aktuellen CSV-Standard gemäß RFC 4180 implementiert, weiß mit Sicherheit genau, wie eine bestimmte Zeichenfolge zu interpretieren ist. Das Argument, dass durch die Verwendung ,eines selteneren Trennzeichens die Daten aufgebläht werden, weil Sie sie ständig maskieren müssen, ist jedoch richtig. Und natürlich gibt es all die Leute, die glauben, dass sie wissen, wie CSV funktioniert, aber das wirklich nicht.
Voo
2
@Voo Ja, aber da "csv" -Dateien so chaotisch verwendet werden, ist es sicherer, keine Kommas zu verwenden und stattdessen andere Trennzeichen, z. B. Semikolons, zu verwenden. Dies ist die Antwort auf die OP-Frage. Es gibt nichts "Besseres" in Semikolons (oder anderen Nicht-Kommas) als Kommas, sie sind in vielen Fällen einfach nur sicherer.
Tim
2
@Voo +1 zu deinem Kommentar. Jedermann, der CSV verwendet, interessiert sich nicht wirklich für aufgeblähte Datendateien!
whuber
17

Technisch gesehen ist Komma so gut wie jedes andere Zeichen, das als Trennzeichen verwendet werden soll. Der Name des Formats weist direkt darauf hin, dass Werte durch Kommas getrennt sind (Comma-Separated Values).

Bei der Beschreibung des CSV-Formats wird Komma als Trennzeichen verwendet.

Alle Felder, die Kommas enthalten, müssen in doppelte Anführungszeichen gesetzt werden. Dies ist also kein Problem für das Einlesen von Daten. Siehe Punkt 6 in der Beschreibung :

  1. Felder, die Zeilenumbrüche (CRLF), doppelte Anführungszeichen und Kommas enthalten, sollten in doppelte Anführungszeichen eingeschlossen werden.

Zum Beispiel verwenden die Funktionen read.csvund write.csvvon R standardmäßig Komma als Trennzeichen.

Djhurio
quelle
4
Dies ist die beste Antwort, da es sich um valueskommagetrennte Antworten handelt. Bei anderen, die auf europäische formattingZahlen anspielen , ist dies kein Problem für die CSV standard, da Sie oben Punkt 6 korrekt zitieren. Abweichungen von der "richtigen Verwendung" bestehen bei jedem Datenformat. Der Punkt ist - kennen Sie Ihre Daten. Andere erwähnen taboder ;grenzen ab, jedoch können diese dieselben Probleme wie Kommas haben, wenn Sie mit Daten arbeiten, die vom Benutzer eingegeben wurden (möglicherweise über ein Formular und erfasst von einer Datenbank). Ich musste mich mit Freitext-Eingabefeldern herumschlagen, die von Menschen verwendet werden habe fett gefingert tab... es saugt)
Adrian Torrie
Tims Antwort wurde jetzt so bearbeitet, dass sie die bereitgestellten Informationen @djhurio enthält.
Adrian Torrie
11

In vielen Ländern ist es nicht nur ein Zifferntrennzeichen in Zahlen, sondern auch Bestandteil der Adresse (z. B. Kundenadresse usw.). Während einige Länder kurze, genau definierte Adressen haben, haben viele andere, langwierige Adressen, einschließlich manchmal zwei Kommas in derselben Zeile. Gute CSV-Dateien enthalten solche Daten in doppelten Anführungszeichen. Aber stark vereinfachte, schlecht geschriebene Parser ermöglichen es nicht, solche zu lesen und zu unterscheiden. (Dann gibt es das Problem, doppelte Anführungszeichen als Teil der Daten zu verwenden, z. B. ein Zitat aus einem Gedicht).

Wirbel Geist
quelle
2
(+1) Der Standard sieht die Verwendung von Anführungszeichen als Teil der Daten vor, indem darauf bestanden wird, diese erneut zu verdoppeln: "Belloc", "Tarantella", "" die Flöhe, die in den hohen Pyrenäen necken "". In England ist es nicht ungewöhnlich, Adressfelder zu finden, die den Namen eines Hauses in Anführungszeichen enthalten, z. B .: "Chatsworth", Melton Road, Leamington. (Es ist nicht klar, warum: Fowler murrte, dass "die Implikation zu sein scheint: in dem Haus zu leben, das vernünftige Leute '164 Melton Road' nennen, aber ein Narr nennt es gerne 'Chatsworth'.")
Scortchi - Reinstate Monica
1
@Scortchi Es scheint, dass wir im Alter von 12 Jahren die gleichen Gedichte gelernt haben (+/- Fehler). Ich befürchte, dass das, was ich als unglücklichen englischen Snobismus des frühen 20. Jahrhunderts der oberen Mittelklasse für die Gewohnheiten der unteren Mittelklasse betrachte, Ihr letztes Beispiel verdunkelt, das für eine kleine Gruppe nicht transparent sein wird.
Nick Cox
@ NickCox: Zwölf Sounds ungefähr richtig. Komisch, dass ich mich nicht erinnern kann, ob ich dieses Jahr irgendwelche Gedichte gelesen habe, geschweige denn irgendwelche Zeilen von ihnen. Obwohl es in Fowlers Ausführungen um die Auswirkung von unnötigen Anführungszeichen auf den Leser ging (siehe unnütze Zitate.com ), haben Sie meines Erachtens Recht, den Einfluss von Snobismus in seiner Beispielwahl zu sehen. Auf jeden Fall hoffe ich, dass der eher geringfügige Punkt, auf den Sie achten müssen, wenn Sie jemals eine CSV-Datei mit englischen Adressen erhalten, trotz meiner Meinungsverschiedenheiten allen klar ist.
Scortchi
1
In Indien ist es üblich, dass Menschen, die ihre ersten Häuser bauen (keine Wohnungen), einen innovativen blumigen Namen behalten, oft in einer Landessprache oder Sanskrit-Phrase, und dieser in doppelten Anführungszeichen wie "Guru Kripa". Namen wie Genelia D'Souza und Derek O'Brien sind auch weit verbreitet. Dann erschweren Adressen, die lauten "Alte Tür Nr. Nnn / Neue Tür Nr. Mm / c", aufgrund der behördlichen Umnummerierung, die Adressenspeicherung noch weiter, da sie in unerwarteten Ecken Schrägstriche und einfache Anführungszeichen enthalten.
Whirl Mind
@WhirlMind: Das ist interessant - ich habe eine Menge von - nun ja, mehr als ich erwartet hätte - schottisch-gälischen und walisischen Hausnamen in England bemerkt.
Scortchi
9

Während die Antwort von @Tim richtig ist - ich möchte hinzufügen, dass "csv" als Ganzes keinen gemeinsamen Standard hat -, werden insbesondere die Escape-Regeln überhaupt nicht definiert, was zu "Formaten" führt, die in einem Programm, aber nicht in einem anderen, lesbar sind . Dies wird durch die Tatsache verschärft, dass jeder "Programmierer" unter der Sonne nur denkt "oooh csv - ich werde meinen eigenen Parser bauen!" und verfehlt dann alle Randfälle.

Darüber hinaus fehlt csv die Fähigkeit, Metadaten oder sogar den Datentyp einer Spalte zu speichern. Dies führt zu mehreren Dokumenten, die Sie lesen müssen, um die Daten zu verstehen.

Christian Sauer
quelle
5
Ja, es gibt standard tools.ietf.org/html/rfc4180 und viele andere Formate speichern keine Metadaten. Es ist nur nicht zum Speichern von Metadaten gedacht. TXT-Dateien speichern auch keine Metadaten zu Textdokumenten.
Tim
4
Tim, dieser Standard wird oft ignoriert, was ihn zu einem Nicht-Standard macht.
Christian Sauer
8
Das Tolle an Standards ist, dass es so viele zur Auswahl gibt. (Verschieden mutiert und zugeschrieben.)
Nick Cox
4

Wenn Sie das Komma-Trennzeichen weglassen und ein Tabulatorzeichen verwenden können, haben Sie einen viel besseren Erfolg. Sie können die Datei mit dem Namen .CSV belassen, und das Importieren in die meisten Programme ist normalerweise kein Problem. Geben Sie beim Importieren Ihrer Datei einfach TAB-Zeichen statt Komma an. Wenn Ihre Daten Kommas enthalten, treten Probleme bei der Angabe von durch Kommas getrennten Zeichen auf, da Sie sich dessen bewusst sind.

Gorilla
quelle
5
Wenn Ihre Daten Registerkarten enthalten, gilt das Umgekehrte. Es ist nur, zumindest nach meiner Erfahrung, weniger wahrscheinlich.
Nick Cox
@Nick und Gorilla: Ich habe gute Ergebnisse mit |als Trennzeichen in selbst gebrauten CSV-ähnlichen Textdateien von Datensätzen (mit Buchtiteln und anderen Dokumentmetadaten) erzielt . |Tritt in den Daten, mit denen ich arbeite, nie auf, so kann ich einfach Perl-Skripte schreiben, die einfach geteilt / verbunden werden, ohne auf Anführungszeichen jeglicher Art zu prüfen. Dies geschah für ein einmaliges Projekt, bei dem lediglich aus einer MS Access-Datenbank gespeicherte Metadaten verarbeitet wurden. Wählen Sie für größere Projekte oder wenn Sie vorhaben, Daten langfristig in diesem Dateiformat zu speichern, etwas Robusteres aus! Ich könnte immer etwas optimieren, wenn der Stapel dieses Monats etwas kaputt macht.
Peter Cordes
@PeterCordes Ich glaube dir, und was auch immer funktioniert. Es ist jedoch klar, dass die Kosten für eigenwillige Separatoren die Notwendigkeit sein können, diese anderen zu erklären, und es ist entscheidend, dass sie solche Datendateien ohne Schwierigkeiten importieren können. Angesichts eines ungewöhnlichen Dateiformats ist es erforderlich, auf eine Routine, eine Funktion oder einen Befehl zuzugreifen, mit denen Zeichenfolgen auf beliebige Trennzeichen aufgeteilt werden können.
Nick Cox
@PeterCordes Als ich einen splitBefehl für Stata schrieb, schaute ich mir unter anderem das Perl-Äquivalent an, um zu sehen, was es tat und was nicht. Nicht der Quellcode, sondern die angebotene Funktionalität.
Nick Cox
1
@ NickCox: Viele Perl-Funktionen sind ziemlich gut gestaltet, IMO. Sie erledigen die Arbeit ohne viele spezielle Einschränkungen, wie Sie sie in awk finden (was oft gut ist), oder insb. andere Unix - Tools wie cut, sortund uniq.
Peter Cordes
4

ASCII stellt uns vier "Trennzeichen" zur Verfügung, wie unten in einem Ausschnitt aus der Manpage ascii (7) * nix gezeigt:

   Oct   Dec   Hex   Char
   ----------------------
   034   28    1C    FS  (file separator)
   035   29    1D    GS  (group separator)
   036   30    1E    RS  (record separator)
   037   31    1F    US  (unit separator)

Diese Antwort bietet einen guten Überblick über die beabsichtigte Verwendung.

Natürlich mangelt es diesen Steuercodes an der Benutzerfreundlichkeit (Lesbarkeit und Eingabe) von gängigeren Begrenzungszeichen, sie sind jedoch akzeptable Optionen für den internen und / oder kurzlebigen Datenaustausch zwischen Programmen.

Ronald Straight
quelle
2
Interessant. Ich glaube nicht, dass ich diese jemals in freier Wildbahn gesehen habe ...
Matt Krause
4

Das Problem ist nicht das Komma; Das Problem ist das Zitieren. Unabhängig davon, welche Datensatz- und Feldbegrenzer Sie verwenden, müssen Sie darauf vorbereitet sein, diese im Inhalt zu erfüllen. Sie benötigen also einen Zitiermechanismus. UND DANN benötigen Sie eine Möglichkeit, um die Anführungszeichen ebenfalls anzuzeigen.

Das Befolgen des RFC 4180-Standards macht alles für alle einfacher.

Ich musste persönlich ein Skript schreiben, um wahrscheinlich die Ausgabe eines Programms zu korrigieren, bei dem dies falsch war. Ich bin also etwas militant. "wahrscheinlich reparieren" bedeutet, dass es für MEINE Daten funktioniert hat, aber ich kann Situationen sehen, in denen es fehlschlagen würde. (In der Verteidigung dieses Programms wurde es vor dem Standard geschrieben.)

Stig Hemmer
quelle