¿Cómo debo evitar las comas y las marcas de voz en los archivos CSV para que funcionen en Excel?

111

Estoy generando un archivo CSV (delimitado por comas en lugar de pestañas). Mis usuarios probablemente abrirán el archivo CSV en Excel haciendo doble clic en él. Mis datos pueden contener comas y marcas de habla, por lo que los escapo de la siguiente manera.

Reference, Title, Description
1, "My little title", "My description, which may contain ""speech marks"" and commas."
2, "My other little title", "My other description, which may also contain ""speech marks"" and commas."

Hasta donde yo sé, esa ha sido siempre la forma de hacerlo. Aquí está mi asombro: cuando abro este archivo en Excel 2010, no se respeta mi escape. Aparecen marcas de habla en la hoja y la coma genera nuevas columnas.

centralscru
fuente

Respuestas:

219

Finalmente encontramos la respuesta a esto.

Excel solo respetará el escape de comas y marcas de voz si el valor de la columna NO está precedido por un espacio. Entonces generando el archivo sin espacios como este ...

Reference,Title,Description
1,"My little title","My description, which may contain ""speech marks"" and commas."
2,"My other little title","My other description, which may also contain ""speech marks"" and commas."

... solucionó el problema. ¡Espero que esto ayude a alguien!

centralscru
fuente
2
Este es un problema con el que me he encontrado antes y siempre lo olvido. Excel debería interrumpir este comportamiento, ya que simplemente crea confusión y no es una regla útil para tener en primer lugar. Eso o csv no deben tener espacios en blanco obligatorios entre comas.
Jacques Mathieu
61

A continuación se muestran las reglas si cree que es aleatorio. Se puede crear una función de utilidad sobre la base de estas reglas.

  1. Si el valor contiene una coma, una nueva línea o comillas dobles, el valor de la cadena debe devolverse entre comillas dobles.

  2. Cualquier carácter de comillas dobles en el valor debe escaparse con otra comilla doble.

  3. Si el valor no contiene una coma, una nueva línea o comillas dobles, entonces el valor de Cadena debe devolverse sin cambios.

AlphaBetaGamma
fuente
4
¿Le duele algo el ajustar entre comillas algo que no tiene comas, comillas dobles o nuevas líneas?
Erik Reppen
2
No, ErikReppen, no creo que eso dolería normalmente. Pertenezco a un fondo de Java donde se recomienda no crear nuevas cadenas reemplazando el texto en las antiguas, ya que tienen su propia parte dentro de la memoria del montón. Si lo desea, puede reemplazar incondicionalmente todos los valores y decirnos si causa algún problema, aunque no debería.
AlphaBetaGamma
2
Se debe citar un campo que comience o termine con un espacio.
Jonathan Rosenne
2

De acuerdo con las instrucciones de Yashu, escribí la siguiente función (es código PL / SQL, pero debería ser fácilmente adaptable a cualquier otro idioma).

FUNCTION field(str IN VARCHAR2) RETURN VARCHAR2 IS
    C_NEWLINE CONSTANT CHAR(1) := '
'; -- newline is intentional

    v_aux VARCHAR2(32000);
    v_has_double_quotes BOOLEAN;
    v_has_comma BOOLEAN;
    v_has_newline BOOLEAN;
BEGIN
    v_has_double_quotes := instr(str, '"') > 0;
    v_has_comma := instr(str,',') > 0;
    v_has_newline := instr(str, C_NEWLINE) > 0;

    IF v_has_double_quotes OR v_has_comma OR v_has_newline THEN
        IF v_has_double_quotes THEN
            v_aux := replace(str,'"','""');
        ELSE
            v_aux := str;
        END IF;
        return '"'||v_aux||'"';
    ELSE
        return str;
    END IF;
END;
aaguilera
fuente
0

Las comillas simples también funcionan bien, incluso sin escapar de las comillas dobles, al menos en Excel 2016:

'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'

Excel lo pondrá en 5 columnas (si elige la comilla simple como "Calificador de texto" en el asistente "Texto a columnas")

golimar
fuente
-3

Incluso después de las comillas dobles, tuve este problema durante unos días.

Se reemplazó el delimitador de tubería con coma, luego todo funcionó bien.

Ramkumar Navaneethakrishnan
fuente
1
Debe dar una muestra de lo que funcionó para usted para que el OP pueda copiarlo y pegarlo si es necesario.
Reuben Tanner