"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 o pacote `encoding/csv` do Go adiciona aspas extras às strings citadas em arquivos CSV?

Por que o pacote `encoding/csv` do Go adiciona aspas extras às strings citadas em arquivos CSV?

Publicado em 17/11/2024
Navegar:186

Why Does Go\'s `encoding/csv` Package Add Extra Quotes to Quoted Strings in CSV Files?

Solução de problemas de resultados CSV peculiares para strings citadas em Go Encoding/CSV

O pacote encoding/csv em Go tem sido objeto de muito debate em relação ao tratamento de strings citadas em arquivos CSV. Este artigo tem como objetivo esclarecer o problema, explorando um fenômeno intrigante observado por um usuário que encontrou aspas extras ao escrever strings citadas em um arquivo CSV.

O enigma das citações extras

O usuário forneceu o seguinte trecho de código para ilustrar o problema:

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

Ao executar este código, a saída esperada para a string citada seria a seguinte:

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

No entanto, a saída realmente obtida foi:

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

A presença de aspas adicionais em torno da string citada era intrigante e exigia uma investigação mais aprofundada.

Compreendendo o padrão CSV

A raiz do problema está em o próprio padrão de formato de arquivo CSV (Valores Separados por Vírgula) De acordo com o padrão, as aspas duplas (") usadas dentro de um campo devem ser representadas por duas aspas duplas (""). Este é um meio de escapar do caractere para fins de análise.

A (double) quote character in a field must be represented by two (double) quote characters.
  • [Vírgula- valores separados - Wikipedia](https://en.wikipedia.org/wiki/Comma-separated_values)

Impacto no CSV Escrevendo

Aplicando esta regra ao código, o usuário estava de fato escapando corretamente das aspas dentro da string citada usando fmt.Sprintf("%q"). No entanto, o pacote encoding/csv adiciona escape adicional por surrou

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

Este escape adicional é necessário para aderir ao padrão CSV, que requer campos devem ser opcionalmente entre aspas duplas, e aspas duplas dentro dos campos devem ser representadas como aspas duplas.

Evitando aspas extras

Enquanto as aspas extras são adicionadas de acordo com o Especificações de codificação CSV, elas podem ser evitadas optando por um formato de codificação alternativo. Alternativamente, se você quiser seguir estritamente o padrão CSV, você pode manipular a string manualmente, substituindo cada aspa dupla por uma aspa dupla, assim:

s = strings.ReplaceAll(s, `"`, `""`)

Conclusão

O comportamento peculiar observado ao escrever strings entre aspas em arquivos CSV no pacote encoding/csv do Go pode ser atribuído ao O próprio padrão CSV, que exige o escape de aspas duplas para análise. Ao compreender esse mecanismo subjacente, você pode escolher formatos de codificação alternativos ou manipular manualmente o escape de string para obter os resultados desejados.

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