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ß.
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.
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.
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.
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, `"`, `""`)
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.
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