"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é el paquete `encoding/csv` de Go agrega comillas adicionales a las cadenas entre comillas en archivos CSV?

¿Por qué el paquete `encoding/csv` de Go agrega comillas adicionales a las cadenas entre comillas en archivos CSV?

Publicado el 2024-11-17
Navegar:519

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

Solución de problemas de resultados CSV peculiares para cadenas entrecomilladas en Go Encoding/CSV

El paquete encoding/csv en Go ha sido objeto de mucho debate con respecto al manejo de cadenas entrecomilladas en archivos CSV. Este artículo tiene como objetivo arrojar luz sobre el problema explorando un fenómeno intrigante observado por un usuario que encontró comillas adicionales mientras escribía cadenas entre comillas en un archivo CSV.

El enigma de las comillas adicionales

El usuario proporcionó el siguiente fragmento de código para ilustrar el 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()
}

Al ejecutar este código, el resultado esperado para la cadena entrecomillada sería el siguiente:

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

Sin embargo, el resultado realmente obtenido fue:

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

La presencia de comillas adicionales alrededor de la cadena citada era desconcertante y requería más investigación.

Comprensión del estándar CSV

La raíz del problema radica en el propio estándar de formato de archivo CSV (valores separados por comas). Según el estándar, las comillas dobles (") utilizadas dentro de un campo deben estar representadas por dos comillas dobles (""). Esta es una forma de escapar el carácter con fines de análisis.

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

Impacto en CSV Al escribir

Aplicando esta regla al código, el usuario estaba escapando correctamente de las comillas dentro de la cadena citada usando fmt.Sprintf("%q"). Sin embargo, el paquete encoding/csv agrega un escape adicional mediante surrou

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

Este escape adicional es necesario para cumplir con el estándar CSV, que requiere campos opcionalmente entre comillas dobles, y las comillas dobles dentro de los campos deben representarse como comillas dobles dobles.

Evitar comillas adicionales

Mientras las comillas adicionales se agregan según las especificaciones de codificación CSV, se pueden evitar optando por un formato de codificación alternativo. Alternativamente, si desea seguir estrictamente el estándar CSV, puede manipular la cadena manualmente reemplazando cada comilla doble con una comilla doble, como esta:

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

Conclusión

El comportamiento peculiar observado al escribir cadenas entrecomilladas en archivos CSV en el paquete encoding/csv de Go se puede atribuir a el estándar CSV en sí, que requiere que se utilicen comillas dobles para el análisis. Al comprender este mecanismo subyacente, puede elegir formatos de codificación alternativos o manejar manualmente el escape de cadenas para lograr los resultados deseados.

Ú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