Convertir CSV a JSON
CSV a JSON analiza una exportación de hoja de cálculo y la convierte en un array de registros en tu navegador. Lee RFC 4180 como es debido —los campos entrecomillados que contienen comas, saltos de línea y comillas escapadas sobreviven todos—, infiere los tipos escalares y reconstruye objetos y arrays anidados a partir de nombres de columna con puntos o corchetes.
¿Cómo funciona Convertir CSV a JSON?
La implementación ingenua de esta conversión es una línea — line.split(",") — y está mal para una buena parte de los archivos reales. Un campo CSV puede ir entrecomillado, y un campo entrecomillado puede contener el delimitador, un salto de línea literal y comillas dobladas que representan una sola. Partir por comas convierte "Hopper, G." en dos campos y desplaza una posición cada columna posterior, lo que corrompe el registro en lugar de dar error con él.
Por eso el analizador de aquí es una máquina de estados explícita sobre el flujo de caracteres, que lleva la cuenta de si está dentro de una región entrecomillada, exactamente como describe RFC 4180. También maneja las cosas que el RFC no menciona pero que los archivos reales contienen: una marca de orden de bytes UTF-8 antes del primer nombre de columna, finales de línea CRLF y LF a secas mezclados en un mismo archivo, un salto de línea final que de otro modo produciría un registro vacío fantasma y una comilla suelta en medio de un campo sin entrecomillar, que escribe Excel y que se toma literalmente en lugar de tratarse como fatal.
La detección del delimitador cuenta los candidatos en la línea de cabecera —coma, punto y coma, tabulador, barra vertical—, pero solo fuera de las regiones entrecomilladas. Un archivo cuya cabecera es name,description, con punto y coma dentro de las descripciones entrecomilladas, se partiría de otro modo por el carácter equivocado, y ese es el tipo de bug que parece datos corruptos y no un ajuste erróneo.
La inferencia de tipos es deliberadamente conservadora. Una celda que encaja con la gramática de números de JSON pasa a número, true / false pasan a booleanos y null pasa a null. Todo lo demás se queda como cadena —incluido 007, porque la gramática prohíbe los ceros a la izquierda y a un número de pieza no se le debe renumerar—, e incluidos los enteros por encima de 2 53 , porque convertirlos tira dígitos sin más.
Por último, los nombres de columna que parecen rutas se tratan como rutas: customer.name reconstruye un objeto anidado, tags[0] reconstruye un array. Como esos nombres vienen del archivo, son entrada no confiable que se usa para indexar un objeto —una columna llamada a.__proto__.polluted es un payload de polución de prototipos, y se rechaza en lugar de seguirse—.
CSV de entrada
id,user.name,tags[0],tags[1] 1,Ada,a,b 2,"Hopper, G.",c,
JSON de salida
[
{ "id": 1, "user": { "name": "Ada" }, "tags": ["a", "b"] },
{ "id": 2, "user": { "name": "Hopper, G." }, "tags": ["c"] }
]CSV de entrada → JSON de salida
CSV de entrada
id,name,joined 1,Ada,1815-12-10 2,Grace,1906-12-09
JSON de salida
[
{
"id": 1,
"name": "Ada",
"joined": "1815-12-10"
},
{
"id": 2,
"name": "Grace",
"joined": "1906-12-09"
}
]¿Qué opciones y casos límite admite Convertir CSV a JSON?
| Parámetro | Tipo | Valor predeterminado | Comportamiento y casos límite |
|---|---|---|---|
| Delimitador | auto | , ; tab | | auto | Auto cuenta candidatos en la línea de encabezado, ignorando cualquier cosa dentro de comillas. Sobrescríbelo cuando el encabezado de un archivo no es representativo de su contenido. |
| Fila de encabezado | booleano | true | La primera fila proporciona las claves. Con ella desactivada, las claves son columna1, columna2, etc. Una celda de encabezado en blanco también recurre a un nombre posicional para que el registro nunca tenga una clave faltante. |
| Inferir tipos | booleano | true | Aplica la gramática de número de JSON más true/false/null. «007», «+1», «0x10» y «1,5» permanecen como cadenas. Desactívalo cuando cada columna debe mantenerse como texto — la razón habitual es una columna de ID llena de dígitos. |
| Expandir rutas | booleano | true | Reconstruye la anidación a partir de customer.name y tags[0]. Con ella desactivada obtienes un objeto plano cuyas claves son los nombres literales de las columnas, que es lo que quieres cuando una columna se llama realmente «user.name». |
| Celdas vacías | omitir | mantener | omitir | CSV no puede distinguir un campo ausente de una cadena vacía. Omitir es el mejor predeterminado porque el conjunto de columnas es una unión: un registro que simplemente no tiene tags[1] se escribe como una celda vacía exactamente como uno cuyo tags[1] es «». |
| Campos entre comillas | RFC 4180 | — | Un campo entre comillas puede contener el delimitador, CR, LF y comillas dobles. Una comilla no terminada es un error grave con la línea y columna, porque truncar silenciosamente produciría una salida plausible pero incorrecta. |
| Filas irregulares | advertencia | — | Se mantiene una fila con el número incorrecto de campos, no se descarta: los campos faltantes se omiten y los extras se ignoran, con una advertencia que indica cuántas filas se vieron afectadas. |
| Columnas duplicadas | advertencia | gana la derecha | Coincide con el comportamiento de la importación de hojas de cálculo. Se advierte explícitamente, porque descartar silenciosamente una columna que la persona usuaria puede ver en el archivo es peor que indicarlo. |
Preguntas frecuentes
¿Por qué mi archivo se convierte mal cuando un campo contiene una coma?
No debería —este analizador controla bien las comillas, así que "Hopper, G." se queda como un solo campo—. Si un conversor lo parte en dos, es que parte por comas sin mirar las comillas, que es el bug más común del CSV. Si ocurre aquí, comprueba si el campo está realmente entrecomillado en el archivo de origen: una coma sin entrecomillar es genuinamente ambigua y ningún analizador puede recuperarla.
¿Por qué los ceros a la izquierda de mi columna de ID desaparecen una y otra vez?
Aquí no —"007" se queda como cadena, porque la gramática de números de JSON prohíbe los ceros a la izquierda, y esa regla es justo la que protege números de pieza, códigos postales y referencias de cuenta—. Si los ceros desaparecen, ocurrió en la hoja de cálculo antes de exportar: Excel los quita al importar a menos que la columna esté configurada como Texto. Si quieres que se conserve cada columna como texto, desactiva «Inferir tipos».
¿Qué hace customer.name en una cabecera?
Reconstruye un objeto anidado: {"customer":{"name":"…"}}. Los nombres con corchetes, como tags[0], reconstruyen arrays. Es la inversa de lo que escribe «Convertir JSON a CSV», así que un documento sobrevive a un viaje de ida y vuelta por una hoja de cálculo. Si tus columnas se llaman de verdad con puntos y quieres que se tomen literalmente, desactiva «Expandir rutas».
¿Puede manejar un archivo con saltos de línea dentro de un campo?
Sí, siempre que el campo esté entrecomillado, que es lo que exige RFC 4180. Una dirección o un comentario que ocupan varias líneas son habituales en las exportaciones y se manejan correctamente. Lo que no se puede manejar es un salto de línea sin entrecomillar a mitad de registro, porque nada lo distingue del final de la fila.
¿De qué tamaño puede ser el archivo que convierta?
Hasta 8 MB. La conversión corre en el hilo principal, y por encima de ese techo se rechaza con un mensaje en lugar de intentarse, porque intentarlo bloquea la pestaña. No se sube nada a ningún tamaño —el archivo lo lee tu navegador y nunca se envía a ningún sitio—.
¿Se envían los datos de mi hoja de cálculo a un servidor?
No. El análisis ocurre en la página que ya tienes abierta. Esto importa de manera específica en esta herramienta, porque una exportación CSV suele ser registros reales —clientes, pedidos, nóminas— y enviar una a un endpoint desconocido para reformatearla es una divulgación que no puedes deshacer. Abre el panel Network y obsérvalo mientras pegas.