CSV a JSON
Detección de delimitador, campos entrecomillados e inferencia de tipos que no se come tus códigos postales.
Nada de lo que pegues sale de tu navegador. La lista de permitidos de connect-src convierte eso en una garantía del navegador, no en una promesa. Compruébalo tú mismo
Convierte CSV en un array JSON de objetos, usando la fila de cabecera como claves. Los delimitadores se detectan, los campos entrecomillados con comas y saltos de línea dentro se gestionan, y los nombres de columna duplicados se renombran en vez de descartarse.
La inferencia de tipos está desactivada por defecto, y eso es deliberado.
Por qué todo valor es una cadena hasta que digas lo contrario
La inferencia de tipos es donde los conversores de CSV destruyen datos. Un CSV no tiene tipos, así que el conversor tiene que adivinar, y las suposiciones fallan de formas difíciles de notar.
007 pasa a ser 7 y adiós al código postal. Un número de teléfono escrito como 1234567890123456789 supera lo que puede contener un número de JavaScript y vuelve distinto. Un código de producto como 1E5 pasa a ser 100000. Un valor NA se convierte en una cadena en una fila y en la cabecera de una columna en otra parte.
Así que el valor por defecto son cadenas. Activa la inferencia cuando conozcas tus datos, y ten en cuenta que incluso entonces se conservan los ceros a la izquierda y cualquier valor que no sobreviviría a un ida y vuelta por float64 se queda como cadena.
Las reglas del CSV con las que tropieza todo el mundo
- Entrecomillado
- RFC 4180: un campo que contiene una coma, una comilla o un salto de línea se envuelve en comillas dobles, y una comilla interior se convierte en dos comillas. Este parser lo lee correctamente, incluidos los campos multilínea.
- Delimitadores
- La coma, el punto y coma, el tabulador y la barra vertical se detectan automáticamente contando apariciones fuera de las comillas en las primeras líneas. El Excel europeo escribe puntos y coma.
- Cabeceras duplicadas
- Los objetos JSON no pueden tener claves duplicadas, así que un nombre de columna repetido recibe un sufijo y el cambio se reporta. Descartar una sería pérdida silenciosa de datos.
- Filas irregulares
- Una fila con menos campos que la cabecera recibe nulls; una con más conserva los sobrantes bajo una clave _extra. Ambos casos se reportan con su número de línea en vez de realinearse en silencio.
- La marca de orden de bytes
- Se elimina y se reporta. Si se deja, pasa a formar parte del nombre de la primera columna, lo que produce un campo que falta misteriosamente.
Reconstruir la estructura anidada
Si tus cabeceras son rutas con puntos, como ocurre en un CSV producido por nuestro propio conversor, activa «expandir cabeceras con puntos» y el anidamiento se reconstruye: address.city pasa a ser un objeto anidado en vez de una clave que contiene un punto.
How to do this in code
Convertir en código.
py Python
utf-8-sig elimina el BOM. dtype=str es la forma de impedir que pandas convierta 007 en 7.
import csv, json
# The standard library gives you strings, which is the honest default
with open('in.csv', newline='', encoding='utf-8-sig') as f:
rows = list(csv.DictReader(f))
print(json.dumps(rows, indent=2))
# pandas infers types, which is convenient and lossy
import pandas as pd
df = pd.read_csv('in.csv', dtype=str) # dtype=str turns inference OFF
records = df.to_dict(orient='records') js JavaScript
import Papa from 'papaparse';
const { data, errors } = Papa.parse(csv, {
header: true,
skipEmptyLines: true,
dynamicTyping: false, // leave it off; see the note above
}); sh Shell
# csvkit
in2csv data.csv | csvjson --indent 2 > data.json
# Or with Miller, which is a single binary
mlr --icsv --ojson cat data.csv Preguntas frecuentes
- ¿Debería activar la inferencia de tipos?
- Solo si conoces los datos. Acierta la mayoría de las veces y las excepciones son justo los valores que no te puedes permitir perder: códigos postales, números de cuenta, referencias de pieza, números de teléfono, cualquier cosa con un cero a la izquierda. Incluso con la inferencia activada, esta herramienta los deja en paz.
- ¿Por qué el nombre de mi primera columna es raro?
- Una marca de orden de bytes. Esta herramienta la elimina y lo dice. Un parser que no lo haga deja un carácter invisible al principio del nombre, así que las búsquedas por ese nombre fallan sin motivo visible.
- ¿Puedo obtener NDJSON en vez de un array?
- Convierte aquí y luego usa la página de NDJSON, que convierte un array en un registro por línea. Ese es el mejor formato para cualquier cosa que vayas a transmitir en flujo o a la que vayas a añadir registros.