Gibt es eine Möglichkeit, Kommas in CSV-Spalten einzufügen, ohne die Formatierung zu unterbrechen?

282

Ich habe eine zweispaltige CSV mit einem Namen und einer Nummer. Der Name einiger Personen verwendet beispielsweise Kommas. Joe Blow, CFA.Dieses Komma unterbricht das CSV-Format, da es als neue Spalte interpretiert wird.

Ich habe nachgelesen und das häufigste Rezept scheint darin zu bestehen, dieses Zeichen oder das Trennzeichen durch einen neuen Wert (z this|that|the, other. B. ) zu ersetzen .

Ich möchte das Komma-Trennzeichen wirklich beibehalten (ich weiß, dass Excel andere Trennzeichen unterstützt, andere Interpreter jedoch möglicherweise nicht). Ich möchte auch das Komma im Namen behalten, da es Joe Blow| CFAziemlich albern aussieht.

Gibt es eine Möglichkeit, Kommas in CSV-Spalten einzufügen, ohne die Formatierung zu unterbrechen, z. B. indem Sie sie maskieren?

buley
quelle
1
Mögliches Duplikat des Umgangs mit Kommas in einer CSV-Datei
Ciro Santilli 法轮功 冠状 病 六四 六四 法轮功
Kleiner Hack, der bei mir funktioniert hat: Öffnen Sie die CSV-Datei in einem Texteditor und fügen Sie sie in ein Excel-Dokument ein. Funktioniert, wenn Sie dies in großen Stücken tun können.
Jonas
@ Jonas: Excel kann nicht erraten, ob dasselbe Token als Trennzeichen oder Teil der Daten verwendet wird. Das Einfügen aus einem Texteditor ändert daran nichts.
Unsichtbarer

Antworten:

370

Schließen Sie das Feld in Anführungszeichen ein, z

field1_value,field2_value,"field 3,value",field4, etc...

Siehe Wikipedia .

Aktualisiert :

Um ein Anführungszeichen zu codieren, verwenden Sie "ein doppeltes Anführungszeichen in einem Feld als ""und das gesamte Feld wird """". Wenn Sie also beispielsweise in Excel Folgendes sehen:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

Die CSV-Datei enthält:

regular_value,",,,""",","""",","""""""",""""

Ein Komma wird einfach in Anführungszeichen gesetzt, ,wird also ",".

Ein Komma und Zitat Bedürfnisse gekapselt und zitiert werden, so ","wird """,""".

Ryan
quelle
4
Das hat bei mir funktioniert! Ich habe eine js-Variable in CSV exportiert und ein zusätzliches Anführungszeichen um jede Zeichenfolge gesetzt, um das in der Frage erwähnte Problem von "John Blow, CFA" zu lösen.
Madhulika Mukherjee
Was ist, wenn in jeder Zelle sowohl Anführungszeichen als auch Kommas stehen?
Speedplane
2
Ich habe die Antwort mit einigen Beispielen aktualisiert - kurz gesagt, Kommas werden in Anführungszeichen (z. B. ",") eingekapselt und Anführungszeichen werden (z. B. """)
Ryan
6
Dies sollte nun die akzeptierte Antwort sein, da es eine großartige Lösung vorschlägt, die wahrscheinlich 99% der Anwendungsfälle löst.
BuZz
Gibt es eine C # -Bibliothek zum Parsen von CSV-Dateien mit Anführungszeichenfeldern?
Minh Tran
34

Das Problem mit dem CSV-Format ist, dass es nicht eine Spezifikation gibt, sondern mehrere akzeptierte Methoden, bei denen nicht unterschieden werden kann, welche verwendet werden sollen (zum Generieren / Interpretieren). In einem anderen Beitrag habe ich alle Methoden zum Entkommen von Zeichen (in diesem Fall Zeilenumbrüche, aber dieselbe Grundvoraussetzung) besprochen . Grundsätzlich kommt es darauf an, einen CSV-Generierungs- / Escape-Prozess für die beabsichtigten Benutzer zu verwenden und zu hoffen, dass der Rest nichts dagegen hat.

Referenzspezifikationsdokument .

Rudu
quelle
10
RFC 4180, Common Format und MIME-Typ für CSV-Dateien (Comma-Separated Values), ietf.org/rfc/rfc4180.txt ; eine weitere "offizielle" Spezifikation.
Shi
3
Die Einbeziehung des am weitesten verbreiteten Ansatzes würde dies zu einer großartigen Antwort machen. So wie es aussieht, gewinnt die Antwort von @Ryan.
Rinogo
16

Wenn Sie das machen möchten, was Sie gesagt haben, können Sie Anführungszeichen verwenden. Etwas wie das

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

Jetzt können Sie in Ihrer Namensvariablen ein Komma verwenden.

Wolke
quelle
Danke Cloud für deinen Tipp, das hat es geschafft: $whatever = "\"".$name."\"";
Washere
Danke für deine Lösung.
Bhavin Thummar
10

Sie müssen diese Werte angeben.
Hier ist eine detailliertere Spezifikation.

SLaks
quelle
2
Es gibt mehrere Spezifikationen, Excel verwendet Anführungszeichen um den Eintrag, Linux verwendet das Backslash-Zeichen. Leider müssen Sie für Ihr Zielgruppen- / Zielsystem entkommen.
Rudu
7

Zusätzlich zu den Punkten in anderen Antworten: Wenn Sie in Excel Anführungszeichen verwenden, sollten Sie die Platzierung Ihrer Leerzeichen beachten. Wenn Sie eine Codezeile wie diese haben:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

Excel behandelt das ursprüngliche Anführungszeichen als wörtliches Anführungszeichen, anstatt es als Komma zu verwenden. Ihr Code muss geändert werden zu

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

Es war diese Subtilität, die mich hierher brachte.

hlongmore
quelle
3

Ich hatte das gleiche Problem und das Zitieren ,half nicht. Schließlich ersetzte ich das ,mit +, beendete die Verarbeitung, speicherte die Ausgabe in einer Outfile und ersetzte das +mit ,. Das mag hässlich erscheinen, aber es hat bei mir funktioniert.

Mohammed
quelle
2
Und was hätten Sie getan, wenn die Daten "+" Zeichen enthalten hätten?
Andrew Morton
1
@ AndrewMorton Ja, das ist eine Herausforderung. In meinem Fall bin ich mir +jedoch sicher, dass dies in meinen Daten überhaupt nicht vorhanden ist. Vielen Dank für Ihren freundlichen Kommentar.
Mohammed
4
Die einfache und robuste Methode besteht darin, die Zeichenfolgen in doppelte Anführungszeichen zu setzen und doppelte Anführungszeichen in Zeichenfolgen zu umgehen, indem zwei davon wie verwendet werden "". Dies ist die normale Vorgehensweise.
Andrew Morton
1
Wenn es nicht funktioniert, überprüfen Sie, ob Sie keine Leerzeichen neben Ihren Begrenzungskommas generieren: "Frosch", "Gelb, Grün" funktioniert nicht "Frosch", "Gelb, Grün"
funktioniert
Persönlich fand ich den zweiten Kommentar von @AndrewMorton hier, der mir tatsächlich half zu verstehen, was besser ist als eine akzeptierte Antwort. Schritt 1 - doppelte Anführungszeichen in den Datenfeldern umgehen, z. B. in Python: field = field.replace('"', '""')Schritt 2 - nach Schritt 1 das Feld selbst in doppelte Anführungszeichen einschließen, z. B. field = '"' + field + '"'- dann sind Sie, glaube ich, eisern gegossen.
Will Croxford
3

Abhängig von Ihrer Sprache ist möglicherweise eine to_json-Methode verfügbar. Das wird vielen Dingen entgehen, die CSVs brechen.

Amiksch
quelle
3

Ich habe festgestellt, dass einige Anwendungen wie Numbers in Mac das doppelte Anführungszeichen ignorieren, wenn davor Platz ist.

a, "b,c"funktioniert nicht während der a,"b,c"Arbeit.

Mudin
quelle
1
Sie haben mir wahrscheinlich gerade eine Stunde Arbeit erspart ... danke!
Shaun314
1

Sie können Ihre Werte beispielsweise in PHP base64_encode ($ str) / base64_decode ($ str) codieren.

IMO ist dies einfacher als das Verdoppeln von Anführungszeichen usw.

https://www.php.net/manual/en/function.base64-encode.php

Die codierten Werte enthalten niemals ein Komma, sodass jedes Komma in Ihrer CSV ein Trennzeichen ist.

Kevin
quelle
1

Sie können Vorlagenliterale (Vorlagenzeichenfolgen) verwenden.

z.B -

`"${item}"`
सत्यमेव जयते
quelle
1
Lief wie am Schnürchen!
waliurjs
0

Sie können das Text_QualifierFeld in Ihrem Flatfile-Verbindungsmanager als verwenden ". Dies sollte Ihre Daten in Anführungszeichen setzen und nur durch Kommas getrennt werden, die außerhalb der Anführungszeichen stehen.

Sakshi Jain
quelle
0

Wenn der Artikelwert ein doppeltes Anführungszeichen (") hat, ersetzen Sie ihn zunächst durch 2 doppelte Anführungszeichen (" ").

item = item.ToString().Replace("""", """""")

Zum Schluss wickeln Sie den Artikelwert ein:

LINKS: Mit doppeltem Anführungszeichen (")

RECHTS: Mit doppeltem Anführungszeichen (") und Komma (,)

csv += """" & item.ToString() & ""","
LifeiSHot
quelle
0

Doppelte Anführungszeichen haben bei mir nicht funktioniert, bei mir \". Wenn Sie als Beispiel doppelte Anführungszeichen setzen möchten, können Sie festlegen \"\".

Sie können als Beispiel Formeln erstellen:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

wird in csv schreiben:

= IF (C3 = 1, B3)

Mathengineer
quelle
0

Vielleicht nicht das, was hier gebraucht wird, aber es ist eine sehr alte Frage und die Antwort kann anderen helfen. Ein Tipp, den ich beim Importieren in Excel mit einem anderen Trennzeichen nützlich finde, ist das Öffnen der Datei in einem Texteditor und das Hinzufügen einer ersten Zeile wie:

sep = |

wo | ist das Trennzeichen, das Excel verwenden soll. Alternativ können Sie das Standardtrennzeichen in Windows ändern, aber etwas langwierig:

Systemsteuerung> Uhr & Region> Region> Formate> Zusätzliche> Zahlen> Listentrennzeichen [Wechsel vom Komma zu Ihrer bevorzugten Alternative]. Das bedeutet, dass Excel standardmäßig auch CSVs mit dem ausgewählten Trennzeichen exportiert.

user25307
quelle