Le package encoding/csv dans Go a fait l'objet de nombreux débats concernant la gestion des chaînes citées dans des fichiers CSV. Cet article vise à faire la lumière sur le problème en explorant un phénomène intrigant observé par un utilisateur rencontré des guillemets supplémentaires lors de l'écriture de chaînes entre guillemets dans un fichier CSV.
L'utilisateur a fourni l'extrait de code suivant pour illustrer le problème :
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()
}
Lors de l'exécution de ce code, le résultat attendu pour la chaîne entre guillemets serait le suivant :
[Quoted string "Cr@zy text with , and \\ and \" etc"]
Cependant, le résultat réellement obtenu était :
[Quoted string,"""Cr@zy text with , and \\ and \"" etc"""]
La présence de guillemets supplémentaires autour de la chaîne citée était déroutante et nécessitait une enquête plus approfondie.
La racine du problème réside dans la norme de format de fichier CSV (Comma-Separated Values) elle-même. Selon la norme, les guillemets doubles ("") utilisés dans un champ doivent être représentés par deux guillemets doubles (""). Il s'agit d'un moyen d'échapper le caractère à des fins d'analyse.
A (double) quote character in a field must be represented by two (double) quote characters.
En appliquant cette règle au code, l'utilisateur échappait en effet correctement les guillemets dans la chaîne citée en utilisant fmt.Sprintf("%q"). Cependant, le package encoding/csv ajoute un échappement supplémentaire par surrou
[Unquoted string Cr@zy text with , and `\` and " etc] [Quoted string `""""Cr@zy text with , and `\` and \"" etc""""`]
Cet échappement supplémentaire est nécessaire pour adhérer à la norme CSV, qui nécessite des champs être éventuellement entourés de guillemets doubles, et les guillemets doubles dans les champs doivent être représentés sous forme de guillemets doubles.
Alors que les guillemets supplémentaires les guillemets sont ajoutés conformément aux spécifications d'encodage CSV, ils peuvent être évités en optant pour un format d'encodage alternatif. Alternativement, si vous souhaitez suivre strictement la norme CSV, vous pouvez manipuler la chaîne manuellement en remplaçant chaque guillemet simple par un guillemet double, comme ceci :
s = strings.ReplaceAll(s, `"`, `""`)
Le comportement particulier observé lors de l'écriture de chaînes entre guillemets dans des fichiers CSV dans le package d'encodage/csv de Go peut être attribué à la norme CSV elle-même, qui nécessite l'échappement des guillemets doubles pour l'analyse. En comprenant ce mécanisme sous-jacent, vous pouvez soit choisir des formats d'encodage alternatifs, soit gérer manuellement l'échappement des chaînes pour obtenir les résultats souhaités.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3