En este fragmento de código, el objetivo es escribir datos en un archivo CSV, asegurando que las cadenas entrecomilladas dentro los datos se escapan correctamente. Sin embargo, el CSV resultante contiene comillas adicionales, lo que genera inconsistencias.
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()
}
El resultado esperado para la cadena entrecomillada es:
[Unquoted string Cr@zy text with , and \ and " etc] [Quoted string "Cr@zy text with , and \\ and \" etc"]
Sin embargo, el resultado real contiene comillas adicionales:
Unquoted string,"Cr@zy text with , and \ and "" etc" Quoted string,"""Cr@zy text with , and \\ and \"" etc"""
Comprensión de las comillas adicionales
Las comillas adicionales en el La cadena entrecomillada es el resultado de seguir el estándar CSV, que requiere que las comillas dobles se escapen como dos comillas dobles. Esto es necesario para distinguir entre las comillas dobles reales dentro de los datos y las utilizadas para la delimitación de registros.
Solución
El código no necesita preocuparse por escapar de las comillas dobles porque el lector CSV los elimina automáticamente. Por lo tanto, la solución es eliminar las comillas dobles adicionales al escribir la cadena entrecomillada.
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)
}
Salida actualizada
Unquoted string,Cr@zy text with , and \ and " etc Quoted string,"Cr@zy text with , and \\ and \" etc"
Con este cambio, la cadena entre comillas ahora tiene un carácter de escape correcto y se eliminan las comillas adicionales.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3