Escápese correctamente una comilla doble en CSV


164

Tengo una línea como esta en mi CSV:

"Samsung U600 24"","10000003409","1","10000003427"

La cita al lado 24se usa para expresar pulgadas, mientras que la cita al lado de esa cita cierra el campo. Estoy leyendo la línea fgetcsvpero el analizador comete un error y lee el valor como:

Samsung U600 24",10000003409"

Intenté poner una barra diagonal inversa antes de la comilla de pulgadas, pero luego recibí una barra diagonal inversa en el nombre:

Samsung U600 24\"

¿Hay alguna manera de escapar adecuadamente de esto en el CSV, para que el valor sea Samsung U600 24", o tengo que regexearlo en el procesador?


21
Solo duplica tu cotización. Eso es todo
su sentido común

Respuestas:


281

Use 2 citas:

"Samsung U600 24"""

102
RFC-4180, párrafo "Si se usan comillas dobles para encerrar campos, entonces se debe escapar una comilla doble que aparece dentro de un campo precediéndola con otra comilla doble".
Tommed

44
Como dice Tommed, solo necesita agregar una comilla doble para escapar de una comilla doble. Puede usar una herramienta de línea de comandos llamada csvfix para detectar cualquier línea que no se ajuste: csvfix check -nl -v [nombre de archivo]
Sam Critchley

2
@SamCritchley Solo veo que se usa una comilla doble para escapar aquí. Por "Usar 2 comillas", user4035 significa que 1 comilla debe reemplazarse por 2 comillas. Al escapar de las comillas dobles con comillas dobles, efectivamente está creando pares de comillas dobles (2 comillas dobles). La cita final que ve al final es terminar el campo.
Zenexer

1
Se requieren comillas simples, dobles, dobles, dobles, pero solo si se procede con una doble doble doble ... ¡la mejor de las suertes!
Daniel Waltrip

14

No solo las comillas dobles, necesitará comillas simples ( '), comillas dobles ( "), barra diagonal inversa ( \) y NUL (el byte NULO).

Úselo fputcsv()para escribir y fgetcsv()leer, lo que se encargará de todos.


3
Este comentario en la página de documentaciónfputcsv() muestra cómo puede usar fputcsv()cuando desea enviar en formato csv al navegador en lugar de a un archivo real.
dennisschagt

15
@Angelin Nadar, ¿podría agregar una fuente a su reclamo sobre la necesidad de duplicar comillas simples, barra diagonal inversa y NUL? No lo encontré en RFC-4180 .
Petr 'PePa' Pavel

2
No necesita escapar de comillas simples, etc. Un archivo CSV adecuado ni siquiera necesita agregar comillas dobles alrededor de un campo que contiene solo comillas simples. Si el lector CSV se implementa correctamente, debería leer el archivo correctamente incluso con esos símbolos.
xji

44
¿Por qué se votó esta respuesta? El comentario sobre los caracteres que escapan nunca fue respaldado y la pregunta original no pregunta sobre PHP. Esto solo parece ser cierto para el delimitador de cadena (y solo para el delimitador elegido) cuando un programa, como Open Office, le permite cambiarlo.
Dave F

0

Sé que esta es una publicación antigua, pero así es como la resolví (junto con la conversión de valores nulos a cadenas vacías) en C # usando un método de extensión.

Cree una clase estática con algo como lo siguiente:

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

Luego, para cada cadena que está escribiendo en CSV, en lugar de:

stringBuilder.Append( WhateverVariable );

Tu solo haces:

stringBuilder.Append( WhateverVariable.Q() );

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.