"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que meu código Go produz aspas extras ao escrever strings entre aspas em um arquivo CSV usando `encoding/csv`?

Por que meu código Go produz aspas extras ao escrever strings entre aspas em um arquivo CSV usando `encoding/csv`?

Publicado em 2024-11-12
Navegar:265

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

Resultados CSV estranhos para strings citadas usando codificação/CSV de Go

Neste trecho de código, o objetivo é gravar dados em um arquivo CSV, garantindo que as strings citadas dentro os dados são escapados corretamente. No entanto, o CSV resultante contém aspas extras, levando a inconsistências.

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()
}

A saída esperada para a string citada é:

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

No entanto, a saída real contém aspas extras:

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

Compreendendo as aspas extras

As aspas extras no string entre aspas é o resultado de seguir o padrão CSV, que exige que as aspas duplas sejam escapadas como duas aspas duplas. Isso é necessário para distinguir entre aspas duplas reais nos dados e aquelas usadas para delimitação de registros.

Solução

O código não precisa se preocupar em escapar de aspas duplas porque o leitor CSV os remove automaticamente. Portanto, a solução é remover as aspas duplas extras ao escrever a string entre aspas.

Código modificado

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)
}

Saída atualizada

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

Com essa alteração, a string entre aspas agora tem escape adequado e as aspas extras são removidas.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3