Maison  >  Article  >  développement back-end  >  Pourquoi le rédacteur CSV de Go ajoute-t-il des guillemets supplémentaires aux chaînes citées contenant des caractères spéciaux ?

Pourquoi le rédacteur CSV de Go ajoute-t-il des guillemets supplémentaires aux chaînes citées contenant des caractères spéciaux ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-25 09:30:02186parcourir

Why does Go's CSV writer add extra quotes to quoted strings containing special characters?

Encodage CSV étrange des chaînes entre guillemets dans Go

Cet extrait de code tente de créer un fichier CSV avec deux enregistrements, l'un avec une chaîne sans guillemets et l'autre avec un guillemet chaîne contenant des caractères spéciaux :

<code class="go">package main

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

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

    w := csv.NewWriter(f)
    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)

    record = make([]string, 0)
    record = append(record, "Quoted string")
    s = fmt.Sprintf("%q", s)
    record = append(record, s)
    fmt.Println(record)
    w.Write(record)

    w.Flush()
}</code>

Cependant, la sortie contient des guillemets supplémentaires entourant la chaîne citée :

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

Explication

Ce comportement est une conséquence du CSV standard. Selon la spécification, les guillemets doubles dans un champ doivent être protégés par des guillemets doubles. Par conséquent, l'éditeur CSV échappe automatiquement les guillemets doubles dans la chaîne entre guillemets.

Solution

Le lecteur CSV supprime automatiquement les guillemets doubles lors de l'analyse, il n'est donc pas nécessaire de s'inquiéter des guillemets supplémentaires . La chaîne citée sera correctement interprétée comme :

"Cr@zy text with , and \ and \" etc"

Exemple

Voici une version améliorée du code avec les échappements inutiles supprimés :

package main

import (
    "encoding/csv"
    "fmt"
    "os"
)
func checkError(e error){
    if e != nil {
        panic(e)
    }
}
func writeCSV(){
    fmt.Println("Writing csv")
    f, err := os.Create("./test.csv")
    checkError(err)
    defer f.Close()

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

    record = []string{ 
      "Quoted string",
      s,
    }
    fmt.Println(record)
    w.Write(record)
    w.Flush()
}
func readCSV(){
    fmt.Println("Reading csv")
    file, err := os.Open("./test.csv")
    defer file.Close();
    cr := csv.NewReader(file)
    records, err := cr.ReadAll()
    checkError(err)
    for _, record := range records {
        fmt.Println(record)
    }
}
func main() {
   writeCSV()
   readCSV()
}

Sortie

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

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