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 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.
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.
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.
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, `"`, `""`)
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.
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