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íntoma | Causa | Solución |
|---|---|---|
| Todo en una sola columna | Delimitador incorrecto | Reabrir indicándolo |
é, ’, ü | UTF-8 leído como Latin-1 | Reabrir como UTF-8 |
 pegado al primer encabezado | Marca de orden de bytes | Quitar el BOM |
| Filas partidas a mitad de registro | Salto de línea dentro de un campo | Corregir las comillas |
| El número de columnas se desajusta después de la fila N | Una comilla sin escapar | Encontrar y reparar la fila N |
| El archivo termina a mitad de fila | Escritura truncada | Volver 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.
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é hace2. 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:
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é hace6. 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:
- 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. - 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.
- 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.
- 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.