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 :
<code class="go">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() }</code>
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.
Application de cette règle à le 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""""`]
This. un échappement supplémentaire est nécessaire pour respecter la norme CSV, qui exige que les champs soient éventuellement entourés de guillemets doubles, et les guillemets doubles à l'intérieur des champs doivent être représentés comme des guillemets doubles.
Bien que les guillemets supplémentaires soient 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 double par. un double guillemet, comme ceci :
<code class="go">s = strings.ReplaceAll(s, `"`, `""`)</code>
Le comportement particulier observé lors de l'écriture de chaînes entre guillemets dans des fichiers CSV dans le package encoding/csv de Go peut être attribué au standard CSV lui-même, ce qui nécessite d'échapper les 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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!