Maison  >  Article  >  développement back-end  >  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 ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-25 04:09:02473parcourir

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 :

<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.

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

Impact sur l'écriture CSV

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.

Éviter les guillemets supplémentaires

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>

Conclusion

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn