Vermeiden Sie ein doppeltes Anführungszeichen in CSV

164

Ich habe eine Zeile wie diese in meiner CSV:

"Samsung U600 24"","10000003409","1","10000003427"

Das Zitat neben 24wird verwendet, um Zoll auszudrücken, während das Zitat direkt neben diesem Zitat das Feld schließt. Ich lese die Zeile mit, fgetcsvaber der Parser macht einen Fehler und liest den Wert wie folgt :

Samsung U600 24",10000003409"

Ich habe versucht, einen Backslash vor das Zoll-Zitat zu setzen, aber dann bekomme ich nur einen Backslash im Namen:

Samsung U600 24\"

Gibt es eine Möglichkeit, dies in der CSV ordnungsgemäß zu umgehen, sodass der Wert lautet Samsung U600 24", oder muss ich ihn im Prozessor neu ausdrücken ?

srgb
quelle
21
Verdoppeln Sie einfach Ihr Angebot. Das ist alles
Ihr gesunder Menschenverstand

Antworten:

281

Verwenden Sie 2 Anführungszeichen:

"Samsung U600 24"""
user4035
quelle
101
RFC-4180, Absatz "Wenn zum Einschließen von Feldern doppelte Anführungszeichen verwendet werden, muss ein doppeltes Anführungszeichen in einem Feld maskiert werden, indem ein weiteres doppeltes Anführungszeichen vorangestellt wird."
tommed
4
Wie tommed sagt, müssen Sie nur ein einfaches Anführungszeichen hinzufügen, um einem doppelten Anführungszeichen zu entgehen. Sie können ein Befehlszeilentool namens csvfix verwenden, um nicht übereinstimmende Zeilen zu erkennen: csvfix check -nl -v [Dateiname]
Sam Critchley
2
@SamCritchley Ich sehe nur ein einfaches doppeltes Anführungszeichen, um hier zu entkommen. Mit "2 Anführungszeichen verwenden" bedeutet user4035, dass 1 Anführungszeichen durch 2 Anführungszeichen ersetzt werden soll. Indem Sie doppelte Anführungszeichen mit doppelten Anführungszeichen umgehen, erstellen Sie effektiv Paare von doppelten Anführungszeichen (2 doppelte Anführungszeichen). Das letzte Zitat, das Sie am Ende sehen, ist das Beenden des Feldes.
Zenexer
1
einfache doppelte doppelte einfache doppelte Anführungszeichen sind erforderlich, aber nur, wenn ein doppeltes einfaches doppeltes Anführungszeichen verwendet wird ... viel Glück!
Daniel Waltrip
15

Sie benötigen nicht nur doppelte Anführungszeichen, sondern auch einfache Anführungszeichen ( '), doppelte Anführungszeichen ( "), Backslash ( \) und NUL (das NULL-Byte).

Verwenden Sie fputcsv()zum Schreiben und fgetcsv()Lesen, was sich um alle kümmert.

Angelin Nadar
quelle
3
Dieser Kommentar auf der Dokumentationsseite vonfputcsv() zeigt, wie Sie verwenden können, fputcsv()wenn Sie im CSV-Format anstelle einer tatsächlichen Datei im Browser ausgeben möchten.
Dennisschagt
15
@Angelin Nadar, könnten Sie bitte eine Quelle zu Ihrer Behauptung hinzufügen, dass einfache Anführungszeichen, Backslash und NUL verdoppelt werden müssen? Ich habe es in RFC-4180 nicht gefunden .
Petr 'PePa' Pavel
2
Sie müssen nicht einfach einfache Anführungszeichen usw. umgehen. Eine ordnungsgemäße CSV-Datei muss nicht einmal doppelte Anführungszeichen um ein Feld hinzufügen, das nur einfache Anführungszeichen enthält. Wenn der CSV-Reader ordnungsgemäß implementiert ist, sollte er die Datei auch mit diesen Symbolen korrekt lesen.
Xji
4
Warum wurde diese Antwort jemals gewählt? Der Kommentar zu entkommenen Zeichen wurde nie gesichert und die ursprüngliche Frage fragt nicht nach PHP. Dies scheint nur für den Zeichenfolgenbegrenzer (und nur für den ausgewählten Begrenzer) zu gelten, wenn Sie ihn in einem Programm wie Open Office ändern können.
Dave F
0

Ich weiß, dass dies ein alter Beitrag ist, aber hier ist, wie ich ihn (zusammen mit der Konvertierung von Nullwerten in leere Zeichenfolgen) in C # mithilfe einer Erweiterungsmethode gelöst habe.

Erstellen Sie eine statische Klasse mit folgenden Elementen:

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

Dann schreiben Sie für jede Zeichenfolge, die Sie in CSV schreiben, anstelle von:

stringBuilder.Append( WhateverVariable );

Sie tun einfach:

stringBuilder.Append( WhateverVariable.Q() );
Scott R. Frost
quelle
-1

Wenn ein Wert ein Komma, ein Zeilenumbruchzeichen oder ein doppeltes Anführungszeichen enthält, muss die Zeichenfolge in doppelte Anführungszeichen eingeschlossen werden. Beispiel: "Newline-Zeichen in diesem Feld \ n".

Sie können das folgende Online-Tool verwenden, um "" und Operatoren zu entkommen. https://www.freeformatter.com/csv-escape.html#ad-output

Hari Krishna
quelle