Generando archivo CSV para Excel, cómo tener una nueva línea dentro de un valor

158

Necesito generar un archivo para Excel, algunos de los valores en este archivo contienen varias líneas.

También hay texto que no está en inglés, por lo que el archivo debe ser Unicode.

El archivo que estoy generando ahora se ve así: (en UTF8, con texto en inglés mezclado y con muchas líneas)

Header1,Header2,Header3
Value1,Value2,"Value3 Line1
Value3 Line2"

Tenga en cuenta que el valor de varias líneas se incluye entre comillas dobles, con una nueva línea diaria normal.

Según lo que encontré en la web, se supone que esto funciona, pero no funciona, al menos no gana los archivos Excel 2007 y UTF8, Excel trata la tercera línea como la segunda fila de datos, no como la segunda línea de la primera fila de datos .

Esto tiene que ejecutarse en las máquinas de mis clientes y no tengo control sobre su versión de Excel, por lo que necesito una solución que funcione con Excel 2000 y versiones posteriores.

Gracias

EDITAR: "resolví" mi problema al tener dos opciones de CSV, una para Excel (Unicode, separada por tabulaciones, sin líneas nuevas en los campos) y otra para el resto del mundo (UTF8, CSV estándar).

No es lo que estaba buscando, pero al menos funciona (hasta ahora)

Nir
fuente
1
FYI: Todo esto funciona perfectamente en LibreOffice e importar un CSV es mucho más fácil en primer lugar.
user2061057
9
La respuesta aceptada sobre los espacios adicionales es increíblemente confusa ahora que ha editado sus preguntas y eliminado los espacios ...
Matti Virkkunen

Respuestas:

70

Debe tener caracteres de espacio al comienzo de los campos SOLO donde los caracteres de espacio son parte de los datos. Excel no eliminará los espacios iniciales. Obtendrá espacios no deseados en sus encabezados y campos de datos. Peor aún, lo "que debería ser "proteger" ese salto de línea en la tercera columna será ignorado porque no está al comienzo del campo.

Si tiene caracteres no ASCII (codificados en UTF-8) en el archivo, debe tener una lista de materiales UTF-8 (3 bytes hex EF BB BF) al comienzo del archivo. De lo contrario, Excel interpretará los datos de acuerdo con la codificación predeterminada de su localidad (por ejemplo, cp1252) en lugar de utf-8, y sus caracteres que no sean ASCII serán descartados.

Los siguientes comentarios se aplican a Excel 2003, 2007 y 2013; no probado en Excel 2000

Si abre el archivo haciendo doble clic en su nombre en el Explorador de Windows, todo funciona bien.

Si lo abre desde Excel, los resultados varían:

  1. Solo tiene caracteres ASCII en el archivo (y no BOM): funciona.
  2. Tiene caracteres no ASCII (codificados en UTF-8) en el archivo, con una lista de materiales UTF-8 al comienzo: reconoce que sus datos están codificados en UTF-8 pero ignora la extensión csv y lo deja en el Texto Importar no un asistente , desafortunadamente con el resultado de que obtiene el problema de salto de línea.

Las opciones incluyen:

  1. Capacite a los usuarios para que no abran los archivos desde Excel :-(
  2. Considere escribir un archivo XLS directamente ... hay paquetes / bibliotecas disponibles para hacerlo en Python / Perl / PHP / .NET / etc.
John Machin
fuente
1
Gracias, arreglé el problema de los espacios iniciales en la pregunta, escribí el ejemplo CSV manualmente y no copié y pegué de un archivo real, el archivo real no incluye esos espacios, buena captura.
Nir
@Nir: Ahora hablemos de tu verdadero problema. Eso significa que tenía una lista de materiales UTF-8, abrió el archivo desde Excel y obtuvo el Asistente de importación de texto sin reconocer que su nueva línea Value3 debería estar "protegida", ¿correcto? ¿O tal vez no tenía una lista de materiales UTF-8 y tuvo que decirle a la TIW que sus datos estaban codificados en UTF-8 y que aún se mezclaban con la nueva línea?
John Machin
¿Qué pasa si quiero usar | como separador de campo, nueva línea como separador de registros, use "para proteger el contenido de los campos de texto, y los campos de texto pueden contener |," y una nueva línea. es posible?
Giorgio
1
FYI: Tengo Excel2007 y CSV exportados del sistema Redmine. Después de agregar UTF-8 BOM (EFBBBF) al principio, Excel abrió el archivo perfectamente. Las nuevas líneas incrustadas en la columna de "descripción del problema" se procesan correctamente, y la estructura de la fila no está dañada, y todos los caracteres nacionales se leen correctamente (se tiraron a la basura cuando se leía sin UTF8 BOM). Excel ni siquiera ha mostrado el asistente de importación de texto. Actualmente, ese CSV ahora tiene EFBBBFencabezado, se usa 0Acomo separador de fila y 0D0Acomo nueva línea dentro de las cadenas en las celdas de texto.
quetzalcoatl
1
Si está intentando que Excel para OS X le lea CSV correctamente, así como Excel para Windows, aquí hay un gran recurso: stackoverflow.com/questions/4348802/…
Alexandre R. Janini
25

Después de muchos ajustes, aquí hay una configuración que funciona generando archivos en Linux, leyendo en Windows + Excel, aunque el formato de nueva línea incrustado no está de acuerdo con el estándar :

  • Las nuevas líneas dentro de un campo deben ser \ n (y obviamente entre comillas dobles)
  • Fin del registro: \ r \ n
  • Asegúrese de no comenzar un campo con iguales, de lo contrario, se trata como una fórmula y se trunca

En Perl, usé Text :: CSV para hacer esto de la siguiente manera:

use Text::CSV;

open my $FO, ">:encoding(utf8)", $filename or die "Cannot create $filename: $!";
my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" });

#for each row...:
$csv -> print ($FO, \@row);
Ian
fuente
3
Sí, eso lo hizo. Puedo confirmar que esto funciona con Windows + Excel, OSX + Numbers y Google Docs.
Yorick Sijsling
3
Usando \ n (también intenté \ n) en un campo encerrado con ", y usando \ r \ n para dividir filas. Todavía no me solucionó este problema en Excel 2010. He intentado ANSI y UTF8-with-BOM. Sin éxito
nl-x
1
Pero esto es porque yo uso | como separador de campo. Si yo uso; como separador de campo, el problema aún existe al importar datos CSV, pero el problema desaparece al abrir el CSV haciendo doble clic en el Explorador de archivos.
nl-x
2
La respuesta de Ian no me funciona en Excel 2003/2010 en Windows 7. Intenté usar un editor hexadecimal para editar mi archivo UTF-8 BOM y eliminé 0D (\ r) de los bits '0D0A' (\ r \ n) para nuevas líneas dentro de los campos. Pero no funciona.
Dan W
Esta respuesta funcionó para mí (¡con cero modificaciones!) Usando Excel 2010 y Windows 7; también usando perl v5.14.2 que se envía con cygwin. Mis nuevas líneas incrustadas fueron todas \n. Gracias
ardnew 01 de
21

Recientemente tuve un problema similar, lo resolví importando un archivo HTML , el ejemplo de referencia sería el siguiente:

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
  <head>
    <style>
      <!--
      br {mso-data-placement:same-cell;}
      -->
    </style>
  </head>
  <body>
    <table>
      <tr>
        <td>first line<br/>second line</td>
        <td style="white-space:normal">first line<br/>second line</td>
      </tr>
    </table>
  </body>
</html>

Lo sé, no es un CSV, y podría funcionar de manera diferente para varias versiones de Excel, pero creo que vale la pena intentarlo.

Espero que esto ayude ;-)

dtldarek
fuente
35
@GusDeCooL La redacción de la primera oración de OP "Necesito generar un archivo para Excel, algunos de los valores en este archivo contienen varias líneas". sugiere que quizás no necesita ser un archivo CSV. Además, el formato de preguntas y respuestas también se aplica a otros lectores, y podría ser una opción viable para algunos de ellos (incluso si el OP tuviera que usar CSV). Encuentro su voto negativo irrazonable (aún así, gracias por explicar por qué).
dtldarek
1
Esta fue la mejor opción para mí, de hecho; ¡Gracias por sugerirlo!
Jordan Gray
8

Vale la pena señalar que cuando un archivo .CSV tiene campos envueltos en comillas dobles que contienen saltos de línea, Excel no importará el archivo .CSV correctamente si el archivo .CSV está escrito en formato UTF-8. Excel trata el salto de línea como si fuera CR / LF y comienza una nueva línea. La hoja de cálculo está confusa. Eso parece ser cierto incluso si se utilizan punto y coma como delimitadores de campo (en lugar de comas).

El problema se puede resolver usando el Bloc de notas de Windows para editar el archivo .CSV, usando Archivo> Guardar como ... para guardar el archivo, y antes de guardar el archivo, cambiando la codificación del archivo de UTF-8 a ANSI. Una vez que el archivo se guarda en formato ANSI, encuentro que Microsoft Excel 2013 que se ejecuta en Windows 7 Professional importará el archivo correctamente.

OneSkyWalker
fuente
7

La nueva línea dentro de un valor parece funcionar si usa punto y coma como separador, en lugar de coma o tabulación, y usa comillas.

Esto funciona para mí tanto en Excel 2010 como en Excel 2000. Sin embargo, sorprendentemente, funciona solo cuando abre el archivo como una nueva hoja de cálculo, no cuando lo importa a una hoja de cálculo existente utilizando la función de importación de datos.

Esben
fuente
sí, pero entonces yo no encontré opción de hacer línea de fondo con punto y coma en Excel
GusDeCooL
¿Qué pasa si algunos de los datos de texto reales contienen punto y coma? Esto no funcionaria.
htm11h
4

En una PC, el carácter ASCII # 10 es lo que desea colocar una nueva línea dentro de un valor.

Sin embargo, una vez que lo ingrese a Excel, debe asegurarse de que el ajuste de línea esté activado para las celdas de varias líneas o la nueva línea aparecerá como un cuadro cuadrado.

devuxer
fuente
3

Esto no funcionará si intenta importar el archivo a EXCEL.

Asociar la extensión de archivo csv con EXCEL.EXE para que pueda invocar EXCEL haciendo doble clic en el archivo csv.

Aquí coloco un texto seguido de NewLine Char seguido de un poco más de texto Y encerrando toda la cadena con comillas dobles.

No use un CR ya que EXCEL colocará parte de la cadena en la siguiente celda.

""text" + NL + "text""

Cuando invoque EXCEL, verá esto. Es posible que deba ajustar automáticamente el tamaño de la altura para verlo todo. Donde los saltos de línea dependerán del ancho de la celda.

2

FECHA

Aquí está el código en Basic

CHR$(34,"2", 10,"DATE", 34)
Peabody
fuente
2

Encontré esto y me ha funcionado

$delimiter = ',';
$enc1 = '"';
$enc2 = '""';

Entonces, donde necesitas tener cosas encerradas

$myfile = ('/path/to/myfile.csv');
//erase any previous contents
$fp = fopen($myfile, 'w+');
fwrite($fp, $enc1 .  'Column Heading 1' . $enc1 . $delimiter );
//append to new file
$fp2 = fopen($myfile, 'a');
fwrite($fp2, $enc1 .  'Column Heading 2' . $enc1 . $delimiter );

.....

fwrite($fp2, $enc1 .  'Last Column Heading' . $enc1 . $delimiter. PHP_EOL );

Luego, cuando necesite escribir algo, como HTML que incluye el "puede hacer esto

fwrite($fp2, $enc2 .  $myhtmlstring . $enc2 . $delimiter);

Las nuevas líneas terminan con . PHP_EOL

El final del script imprime un enlace para que el usuario pueda descargar el archivo.

echo 'Click <a href="myfile.csv">here</a> to download file';
Lisa Simpson
fuente
1

Los archivos UTF que contienen una lista de materiales harán que Excel trate las nuevas líneas literalmente, incluso en ese campo rodeado de comillas. (Probado Excel 2008 Mac)

La solución es hacer que cualquier línea nueva sea un retorno de carro (CHR 13) en lugar de un avance de línea.

Stephen
fuente
Excel 2016 parece tratar mi archivo CSV correctamente incluso si tiene una lista de materiales UTF8. Sin embargo, lo que marcó la diferencia es usar ';' como un separador de campo (que es lo que Excel hace para todas las configuraciones regionales que tienen ',' como separador decimal).
Ale
1

Prueba esto: funciona completamente para mí: pon las siguientes líneas en un xxxx.csvarchivo

hola_x,="este es mi text1"&CHAR(10)&"I sigo escribiendo",hola_a

hola_y,="este es mi text2"&CHAR(10)&"I sigo escribiendo",hola_b

hola_z,="este es mi text3"&CHAR(10)&"I sigo escribiendo",hola_c

Abierto con excel.

en algunos casos se abrirá directamente; de ​​lo contrario, deberá usar la conversión de columna a datos. expanda el ancho de la columna y presione el botón de ajuste de texto. o formatear celdas y activar el texto de ajuste.

y gracias por las otras sugerencias, pero no funcionaron para mí. Estoy en un entorno puro de Windows, y no quería jugar con Unicode u otra cosa divertida.

De esta manera, puedes poner una fórmula de CSV para sobresalir. Puede haber muchos usos para este método de trabajo. (tenga en cuenta el = antes de las comillas)

pd: En sus sugerencias, ponga algunas muestras de los datos, no solo el código.

Ivan Cev
fuente
1

poner "\ r" al final de cada fila en realidad tuvo el efecto de saltos de línea en Excel, pero en el .csv desapareció y dejó un desastre feo donde cada fila se aplastó contra la siguiente sin espacio y sin saltos de línea

Duncan Wallace
fuente
0

La forma en que lo hacemos (usamos VB.Net) es encerrar el texto con nuevas líneas en Chr (34), que es el carácter que representa las comillas dobles y reemplaza todos los caracteres CR-LF por LF.

Sebastian
fuente
0

Normalmente una nueva línea es "\ r \ n". En mi CSV, reemplacé "\ r" con un valor vacío. Aquí hay código en Javascript:

cellValue = cellValue.replace(/\r/g, "")

Cuando abro el CSV en MS Excel, funcionó bien. Si un valor tiene varias líneas, permanecerá dentro de 1 celda individual en la hoja de Excel.

Tam Tran
fuente
0

Para Abrir archivo solamente, la sintaxis es

 ,"one\n
 two",...

Lo crítico es que no hay espacio después del primer ",". Normalmente, los espacios están bien y se recortan si no se cita la cadena. Pero por lo demás desagradable. Me tomó un tiempo entenderlo.

No parece importar si la línea está terminada \ n o \ c \ n.

Asegúrese de expandir la barra de fórmulas para que pueda ver el texto en la celda (me atrapó después de un largo día ...)

Ahora, por supuesto, File Open no admitirá UTF-8 correctamente (a menos que uno use trucos).

Excel> Datos> Obtener datos externos > Del texto

Se puede configurar en modo UTF-8 (está muy por debajo de la lista de fuentes). Sin embargo, en ese caso, las nuevas líneas no parecen funcionar y no sé cómo solucionarlo.

(Una cosa podría ser que después de 30 años, la EM haría esto bien).

Manejable
fuente
0

En Excel 365 al importar el archivo:

Datos -> Desde texto / CSV -> Seleccionar archivo> Transformar datos -> Configuración de origen de datos -> Seleccionar origen de datos -> Haga clic en Editar origen -> En el menú desplegable de salto de línea, seleccione Ignorar saltos de línea entre comillas.

El texto anterior se tradujo del portugués, por lo que la redacción podría ser diferente en inglés.

Clodoaldo Neto
fuente
-1

puedes hacer lo siguiente "\"Value3 Line1 Value3 Line2\"". Me funciona generando un archivo csv en java

Fredy Chica
fuente
-2

Aquí hay un enfoque interesante usando JavaScript ...

  String.prototype.csv = String.prototype.split.partial(/,\s*/);  

  var results = ("Mugan, Jin, Fuu").csv();                        

  console.log(results[0]=="Mugan" &&                                   
         results[1]=="Jin" &&                                     
         results[2]=="Fuu",                                       
         "The text values were split properly");                  
ddeloy
fuente
-3

Imprimir una nueva línea HTML <br/>en el contenido y abrirlo en Excel funcionará bien en cualquier Excel

Shashi
fuente
-3

Puede usar el método abreviado de teclado ALT + Intro.

  1. Seleccione la celda que desea editar
  2. ingrese al modo de edición haciendo doble clic o presionando F2 3. Presione Alt + Intro. Esto creará una nueva línea en la celda
Meghana Chamarthy
fuente
¿Cómo se integra eso en la generación de archivos CVS?
jikuja