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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-26 20:17:29700parcourir

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.

<code class="go">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()
}</code>

Le résultat attendu pour la chaîne entre guillemets est :

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

Cependant, le résultat réel 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 guillemets supplémentaires

Les guillemets supplémentaires dans la chaîne 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. citations. 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é

<code class="go">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)
}</code>

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.

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