"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 mon code Go produit-il des guillemets supplémentaires lors de l'écriture de chaînes entre guillemets dans un fichier CSV à l'aide de « encoding/csv » ?

Pourquoi mon code Go produit-il des guillemets supplémentaires lors de l'écriture de chaînes entre guillemets dans un fichier CSV à l'aide de « encoding/csv » ?

Publié le 2024-11-12
Parcourir:873

Why does my Go code produce extra quotes when writing quoted strings to a CSV file using `encoding/csv`?

Résultats CSV étranges pour les chaînes citées à l'aide de l'encodage/CSV de Go

Dans cet extrait de code, l'objectif est d'écrire des données dans un fichier CSV, en garantissant que les chaînes citées à l'intérieur les données sont correctement échappées. Cependant, le CSV résultant contient des guillemets supplémentaires, ce qui entraîne des incohérences.

package main

import (
    "encoding/csv"
    "fmt"
    "log"
    "os"
)

func main() {
    f, err := os.Create("test.csv")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    w := csv.NewWriter(f)
    record := []string{"Unquoted string", "Cr@zy text with , and \\ and \" etc"}
    w.Write(record)

    record = []string{"Quoted string", fmt.Sprintf("%q", "Cr@zy text with , and \\ and \" etc")}
    w.Write(record)

    w.Flush()
}

Le résultat attendu pour la chaîne citée est :

[Unquoted string Cr@zy text with , and \ and " etc]
[Quoted string "Cr@zy text with , and \\ and \" etc"]

Cependant, la sortie réelle contient des guillemets supplémentaires :

Unquoted string,"Cr@zy text with , and \ and "" etc"
Quoted string,"""Cr@zy text with , and \\ and \"" etc"""

Comprendre les citations supplémentaires

Les citations supplémentaires dans le Les chaînes entre guillemets sont le résultat du respect de la norme CSV, qui exige que les guillemets doubles soient échappés sous la forme de deux guillemets doubles. Ceci est nécessaire pour faire la distinction entre les guillemets doubles réels dans les données et ceux utilisés pour la délimitation des enregistrements.

Solution

Le code n'a pas besoin de s'inquiéter de l'échappement des guillemets doubles car le lecteur CSV les supprime automatiquement. Par conséquent, la solution consiste à supprimer les guillemets doubles supplémentaires lors de l'écriture de la chaîne entre guillemets.

Code modifié

for _, record := range [][]string{
    {"Unquoted string", "Cr@zy text with , and \\ and \" etc"},
    {"Quoted string", "Cr@zy text with , and \\ and \" etc"},
} {
    record[1] = fmt.Sprintf("%q", record[1][1:len(record[1])-1])
    w.Write(record)
}

Sortie mise à jour

Unquoted string,Cr@zy text with , and \ and " etc
Quoted string,"Cr@zy text with , and \\ and \" etc"

Avec ce changement, la chaîne entre guillemets est désormais correctement échappée et les guillemets supplémentaires sont supprimé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