"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi le package `encoding/csv` de Go ajoute-t-il des guillemets supplémentaires aux chaînes citées dans les fichiers CSV ?

Pourquoi le package `encoding/csv` de Go ajoute-t-il des guillemets supplémentaires aux chaînes citées dans les fichiers CSV ?

Publié le 2024-11-17
Parcourir:826

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

Dépannage des résultats CSV particuliers pour les chaînes citées dans Go Encoding/CSV

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'énigme des citations supplémentaires

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.

Comprendre la norme CSV

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.
  • [Virgule- valeurs séparées - Wikipédia](https://en.wikipedia.org/wiki/Comma-separated_values)

Impact sur CSV Writing

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.

Éviter les guillemets supplémentaires

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

Conclusion

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.

Dernier tutoriel Plus>

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