"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué mi código Go produce comillas adicionales al escribir cadenas entre comillas en un archivo CSV usando `encoding/csv`?

¿Por qué mi código Go produce comillas adicionales al escribir cadenas entre comillas en un archivo CSV usando `encoding/csv`?

Publicado el 2024-11-12
Navegar:349

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

Resultados CSV extraños para cadenas entrecomilladas usando la codificación/CSV de Go

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.

Último tutorial Más>

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