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.
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