java - para - guardar csv delimitado por punto y coma
¿Cómo debo escapar de las comas y las marcas de voz en archivos CSV para que funcionen en Excel? (4)
Estoy generando un archivo CSV (delimitado por comas en lugar de pestañas). Lo más probable es que mis usuarios abran el archivo CSV en Excel haciendo doble clic en él. Mis datos pueden contener comas y marcas de voz, por lo que estoy escapando 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 sé, esa siempre ha sido la manera de hacerlo. Aquí está mi boggle: cuando abro este archivo en Excel 2010 mi escape no es respetado. Las marcas de voz aparecen en la hoja y la coma provoca nuevas columnas.
A continuación están las reglas si crees que es aleatorio. Se puede crear una función de utilidad sobre la base de estas reglas.
Si el valor contiene una coma, una línea nueva o una comilla doble, el valor de la cadena se debe devolver entre comillas dobles.
Cualquier carácter de comillas dobles en el valor debe escaparse con otra comilla doble.
Si el valor no contiene una coma, una línea nueva o una comilla doble, entonces el valor de la cadena se debe devolver sin cambios.
De acuerdo con las instrucciones de Yashu, escribí la siguiente función (es código PL / SQL, pero debe 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;
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. 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."
... corrigió el problema. ¡Espero que esto ayude a alguien!
Incluso después de las comillas dobles, tuve este problema por unos días.
Reemplazó el Delimitador de Tuberías con Coma, luego las cosas funcionaron bien.