„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Warum fügt das Paket „encoding/csv“ von Go zusätzliche Anführungszeichen zu Zeichenfolgen in Anführungszeichen in CSV-Dateien hinzu?

Warum fügt das Paket „encoding/csv“ von Go zusätzliche Anführungszeichen zu Zeichenfolgen in Anführungszeichen in CSV-Dateien hinzu?

Veröffentlicht am 17.11.2024
Durchsuche:477

Why Does Go\'s `encoding/csv` Package Add Extra Quotes to Quoted Strings in CSV Files?

Fehlerbehebung bei ungewöhnlichen CSV-Ergebnissen für Strings in Anführungszeichen in Go Encoding/CSV

Das Paket „Encoding/CSV“ in Go war Gegenstand vieler Debatten bezüglich der Handhabung von Strings in Anführungszeichen in CSV-Dateien. Ziel dieses Artikels ist es, Licht in das Problem zu bringen, indem er ein faszinierendes Phänomen untersucht, das ein Benutzer beobachtete, als er beim Schreiben von zitierten Zeichenfolgen in eine CSV-Datei auf zusätzliche Anführungszeichen stieß.

Das Rätsel der zusätzlichen Anführungszeichen

Der Benutzer hat bereitgestellt Das folgende Code-Snippet zur Veranschaulichung des Problems:

package main

import (
    "encoding/csv"
    "fmt"
    "os"
)

func main() {
    // Create a file to write CSV data
    f, err := os.Create("./test.csv")
    if err != nil {
        log.Fatal("Error: %s", err)
    }
    defer f.Close()

    // Initialize a CSV writer
    w := csv.NewWriter(f)

    // Unquoted string
    var record []string
    record = append(record, "Unquoted string")
    s := "Cr@zy text with , and \\ and \" etc"
    record = append(record, s)
    fmt.Println(record)
    w.Write(record)

    // Quoted string
    record = make([]string, 0)
    record = append(record, "Quoted string")
    s = fmt.Sprintf("%q", s)
    record = append(record, s)
    fmt.Println(record)
    w.Write(record)

    // Flush the writer to save the changes
    w.Flush()
}

Beim Ausführen dieses Codes wäre die erwartete Ausgabe für die in Anführungszeichen gesetzte Zeichenfolge wie folgt:

[Quoted string "Cr@zy text with , and \\ and \" etc"]

Die tatsächlich erhaltene Ausgabe war jedoch:

[Quoted string,"""Cr@zy text with , and \\ and \"" etc"""]

Das Vorhandensein zusätzlicher Anführungszeichen rund um die zitierte Zeichenfolge war rätselhaft und erforderte weitere Untersuchungen.

Den CSV-Standard verstehen

Die Ursache des Problems liegt im CSV-Dateiformatstandard (Comma-Separated Values). selbst. Gemäß dem Standard müssen doppelte Anführungszeichen ("), die innerhalb eines Felds verwendet werden, durch zwei doppelte Anführungszeichen ("") dargestellt werden. Dies ist eine Möglichkeit, das Zeichen zu Analysezwecken zu maskieren.

A (double) quote character in a field must be represented by two (double) quote characters.
  • [Komma- getrennte Werte – Wikipedia](https://en.wikipedia.org/wiki/Comma-separated_values)

Auswirkungen auf das CSV-Schreiben

Anwenden dieser Regel auf den Code, der Benutzer hat die Anführungszeichen innerhalb der in Anführungszeichen gesetzten Zeichenfolge tatsächlich korrekt maskiert, indem fmt.Sprintf("%q") verwendet wurde. Das Paket „encoding/csv“ fügt jedoch zusätzliches Escapezeichen durch surrou

[Unquoted string Cr@zy text with , and `\` and " etc]
[Quoted string `""""Cr@zy text with , and `\` and \"" etc""""`]

Dieses zusätzliche Escapezeichen ist erforderlich, um den CSV-Standard einzuhalten, der Felder erfordert müssen optional in doppelte Anführungszeichen eingeschlossen werden, und doppelte Anführungszeichen innerhalb von Feldern müssen als doppelte doppelte Anführungszeichen dargestellt werden.

Vermeiden zusätzlicher Anführungszeichen

Während die zusätzlichen Anführungszeichen gemäß den CSV-Kodierungsspezifikationen hinzugefügt werden, sind sie kann vermieden werden, indem man sich für ein alternatives Kodierungsformat entscheidet. Wenn Sie sich strikt an den CSV-Standard halten möchten, können Sie alternativ die Zeichenfolge manuell bearbeiten, indem Sie jedes einzelne doppelte Anführungszeichen durch ein doppeltes doppeltes Anführungszeichen ersetzen, etwa so:

s = strings.ReplaceAll(s, `"`, `""`)

Schlussfolgerung

Das eigenartige Verhalten, das beim Schreiben von Zeichenfolgen in Anführungszeichen in CSV-Dateien im Codierungs-/CSV-Paket von Go beobachtet wurde, kann auf den CSV-Standard selbst zurückgeführt werden, der Folgendes erfordert Wenn Sie diesen zugrunde liegenden Mechanismus verstehen, können Sie entweder alternative Codierungsformate auswählen oder das Escapezeichen für Zeichenfolgen manuell handhaben, um die gewünschten Ergebnisse zu erzielen.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3