mygems

Cómo reparar un archivo CSV roto o mal formado

Todo en una columna, comillas sueltas, filas partidas, acentos rotos. Cómo diagnosticar qué le pasa realmente a un CSV y repararlo.

Por uos ·

La mayoría de los CSV "corruptos" no están corruptos. Un CSV es un archivo de texto, y los archivos de texto rara vez se estropean. Casi siempre ocurre que el archivo se escribió con unas suposiciones y se está leyendo con otras: otro delimitador, otra codificación, una regla de comillas que el exportador aplicó mal.

Así que primero hay que diagnosticar y después reparar. El síntoma te dice cuál de las seis causas es, y cada una tiene su solución.

La respuesta rápida

Mira primero los bytes sin procesar, no el archivo en una hoja de cálculo, que es una herramienta que oculta las pruebas:

head -5 broken.csv          # the actual separators and quotes
file -I broken.csv          # the real encoding
wc -l broken.csv            # how many lines it thinks there are

Luego relaciona el síntoma con su causa:

SíntomaCausaSolución
Todo en una sola columnaDelimitador incorrectoReabrir indicándolo
é, ’, üUTF-8 leído como Latin-1Reabrir como UTF-8
 pegado al primer encabezadoMarca de orden de bytesQuitar el BOM
Filas partidas a mitad de registroSalto de línea dentro de un campoCorregir las comillas
El número de columnas se desajusta después de la fila NUna comilla sin escaparEncontrar y reparar la fila N
El archivo termina a mitad de filaEscritura truncadaVolver a exportar

1. Todo cae en una sola columna

Es el caso más común por mucho, y nunca es culpa del archivo.

Buena parte de Europa continental usa punto y coma, porque allí la coma es el separador decimal. Muchas exportaciones con extensión .csv están en realidad separadas por tabulaciones. head -5 te muestra cuál es en un segundo.

La solución es decirle al lector cuál es el separador, no buscar y reemplazar. Reemplazar los puntos y coma por comas también cambia los que están dentro de valores entre comillas, y entonces sí tienes un archivo realmente roto.

  • Excel: no hagas doble clic. Datos → Desde texto/CSV y elige el delimitador en la vista previa.
  • Google Sheets: Archivo → Importar → separador Personalizado.
  • Línea de comandos: duckdb -c "SELECT * FROM read_csv('broken.csv', delim=';')"
  • En el teléfono: una app que permita reabrir un archivo con ajustes de lectura explícitos, en lugar de una que adivina una vez y se rinde.
CSV Editor - Smart CSViPhone y iPad

Detecta automáticamente delimitadores, encabezados y codificaciones y, lo que importa aquí, te deja reabrir un archivo con ajustes de lectura personalizados cuando la detección falla.

Qué hace

2. Mojibake: é donde debería haber é

El clásico desajuste de codificación. El archivo es UTF-8 y algo lo leyó como Latin-1 o Windows-1252. Los bytes están intactos; la interpretación no.

file -I broken.csv
# broken.csv: text/plain; charset=utf-8

La solución: reabrir declarando UTF-8. En Excel, el cuadro de diálogo de importación tiene una lista desplegable Origen del archivo. Elige 65001: Unicode (UTF-8). En la línea de comandos:

iconv -f WINDOWS-1252 -t UTF-8 broken.csv > fixed.csv

Fíjate en la dirección. Si el archivo realmente es Windows-1252 (sistemas antiguos, algunas exportaciones de ERP), ese comando lo convierte. Si el archivo ya es UTF-8 y solo se está mostrando mal, convertirlo empeora las cosas: estarías codificando el mojibake. Comprueba con file -I antes de ejecutar nada.

3. order_id en el nombre de la primera columna

Una marca de orden de bytes UTF-8: tres bytes invisibles al principio del archivo, escritos por Excel y por muchas herramientas de Windows. Rompe la coincidencia de encabezados en los scripts y aparece como basura en los analizadores simples.

sed -i '' '1s/^\xEF\xBB\xBF//' broken.csv    # macOS
sed -i '1s/^\xEF\xBB\xBF//' broken.csv       # Linux

Quítala solo si algo más adelante se atasca con ella. Excel en realidad quiere el BOM. Así es como reconoce un CSV como UTF-8 al hacer doble clic, y quitarlo es la razón por la que los acentos se rompen para el colega a quien le enviaste el archivo.

4. Filas partidas por la mitad

Esperabas 10 000 filas y salieron 10 340, con fragmentos donde deberían estar las direcciones. Algún campo contiene un salto de línea literal: una dirección, un cuadro de comentarios, un párrafo pegado.

Esto es CSV válido si el campo está entre comillas:

id,name,notes
1,"Alice","Called back.
Wants a refund."

El RFC 4180 lo permite y cualquier analizador correcto lo maneja. El problema aparece cuando una herramienta divide por saltos de línea antes de pensar en las comillas, lo que describe a la mayoría de los comandos de una línea de shell, a varios importadores de hojas de cálculo y a mucho código hecho a mano.

La solución suele estar en el lector, no en el archivo. Usa un analizador que entienda las comillas: DuckDB, el módulo csv de Python, csvkit o cualquier importación real de hoja de cálculo. Si el campo realmente no está entre comillas, la exportación está mal y volver a exportar es más rápido que reparar.

Para confirmar en qué caso estás:

csvclean -n broken.csv        # reports rows with the wrong field count

5. Todo después de la fila 4812 está mal

El número de columnas se desajusta a mitad del archivo y no se recupera. Es una sola comilla sin escapar, y todo lo que sigue se está leyendo dentro de una cadena que nunca se cierra.

id,product,price
1,"6"" pipe",4.50

Ese 6" debió escribirse 6"". En cambio, el analizador ve que el valor termina en 6, luego una " suelta abre otro, y el resto del archivo queda dentro.

Cómo encontrarla:

csvclean -n broken.csv
awk -F',' 'NF != 3 {print NR": "$0}' broken.csv   # rough, ignores quoting

csvclean es la opción fiable; la línea de awk es una aproximación rápida para archivos sin comas entre comillas. Cuando tengas el número de línea, arregla esa fila a mano: o duplicas la comilla interior, o la reemplazas por in. y sigues adelante.

Hacerlo en el teléfono es incómodo sin una app que pueda saltar a una fila y editar una sola celda:

CSV File Viewer - Smart CSViPhone y iPad · Android

Abre el archivo completo y te deja buscar en él, para que encuentres la fila donde se rompe la estructura antes de decidir si reparar o volver a exportar.

Qué hace

6. El archivo simplemente termina

La última línea es medio registro, o el tamaño del archivo es sospechosamente redondo. La escritura se interrumpió, o la descarga.

tail -3 broken.csv

Aquí no hay nada que reparar. Los datos nunca se escribieron. Borra la última línea incompleta y acepta la pérdida, o vuelve a exportar. Si fue una descarga, compara Content-Length con el tamaño real antes de culpar al archivo.

Las reglas de reparación

Cuatro hábitos que convierten la mayoría de lo anterior en algo sin importancia:

  1. Trabaja sobre una copia. cp broken.csv broken.backup.csv. Cada solución de esta página es una suposición hasta que se verifica, y una suposición que no puedes deshacer es un mal trato.
  2. Arregla el lector antes que el archivo. La mayoría de los síntomas aquí son errores de configuración. Reescribir los datos para contentar a un analizador mal configurado te deja con dos problemas.
  3. Nunca uses buscar y reemplazar con los delimitadores. Cambia los que están dentro de valores entre comillas y convierte un archivo legible en uno corrupto.
  4. Cuenta las filas antes y después. En cada reparación. Si el número cambió y no lo pretendías, la reparación rompió algo.

Cuándo rendirse y volver a exportar

Si más de un puñado de filas están mal estructuradas, deja de reparar. Una exportación rota suele significar que el exportador tiene un error con las comillas, y cada fila que produce es sospechosa, incluidas las que ahora se ven bien. Pide el archivo de nuevo, y pídelo con comillas.

Preguntas

¿Por qué todo mi CSV aparece en una sola columna?
El archivo usa un delimitador distinto del que el lector asumió. El punto y coma es el estándar en gran parte de Europa porque la coma es el separador decimal, y los archivos separados por tabulaciones llevan la extensión .csv con una frecuencia sorprendente. Ejecuta head -5 en el archivo para ver el separador real y luego ábrelo de nuevo indicando ese delimitador, en lugar de reemplazar caracteres.
¿Cómo arreglo caracteres extraños como é en un CSV?
Es un desajuste de codificación: el archivo es UTF-8 y algo lo leyó como Latin-1 o Windows-1252. Los bytes están bien. Comprueba la codificación real con `file -I` y luego reabre declarando UTF-8; en el cuadro de importación de Excel, configura Origen del archivo en 65001: Unicode (UTF-8). Ejecuta iconv solo si el archivo realmente es Windows-1252.
¿Qué hace que un CSV se rompa a mitad del archivo?
Casi siempre, una sola comilla sin escapar. Un valor como 6" pipe debe escribirse con la comilla interior duplicada; sin eso, el analizador lee todo lo que sigue como una única cadena enorme y el número de columnas nunca se recupera. `csvclean -n` indica la primera fila donde el número de campos falla.
¿Puede un archivo CSV contener saltos de línea dentro de un campo?
Sí. El RFC 4180 lo permite, siempre que el campo esté entre comillas, y cualquier analizador correcto lo maneja. Las filas parecen partirse por la mitad cuando una herramienta divide por saltos de línea antes de considerar las comillas, lo que describe a la mayoría de los comandos de una línea de shell y a varios importadores de hojas de cálculo. Usa un analizador de CSV de verdad en lugar de reparar el archivo.
¿Cómo quito el BOM de un archivo CSV?
En Linux, `sed -i '1s/^\xEF\xBB\xBF//' file.csv`; en macOS, lo mismo con `sed -i ''`. Hazlo solo si algo más adelante se atasca con él. Excel usa el BOM para reconocer un archivo como UTF-8 al hacer doble clic, así que quitarlo es la razón por la que los acentos se rompen para quien lo reciba después.
¿Puedo reparar un CSV roto en el teléfono?
Para problemas de delimitador y codificación, sí: una app que permita reabrir un archivo con ajustes de lectura explícitos los resuelve sin cambiar un solo byte. Un daño estructural como una comilla sin escapar exige encontrar la fila afectada y editar esa celda, lo cual es posible pero engorroso; si más de unas pocas filas están mal, mejor vuelve a exportar el archivo.

uos — Desarrolla CSV Editor y Smart CSV Viewer, así que lee muchísimos archivos CSV que los exportadores de otras personas generaron mal.