Un cliente me envió una exportación de clientes de 12.000 filas para cargar en una base de datos de puesta en escena. Lo convertí, lo importé y lo envié. Dos días después, su líder de operaciones preguntó por qué unos pocos cientos de clientes en Nueva Jersey tenían códigos postales de cuatro dígitos.
07102 se había convertido 7102. Cada cremallera que comienza con un cero, en todo el archivo, se amputa silenciosamente. No por un error, por una característica. Inferencia de tipo observada 07102, vio algo que coincidía con "un número", y lo convertía útilmente en uno. Los ceros iniciales no son una cosa que tengan los números.
construí el Convertidor de CSV a JSON en Toolz.dev, y también lo hace. Voy a mostrarle exactamente dónde, porque un convertidor que cambia silenciosamente sus datos es más peligroso que uno que simplemente falla.
TL;Dr: los Convertidor de CSV a JSON Convierte un CSV en una matriz de objetos, usando la primera fila como claves, que se ejecutan completamente en su navegador. él Siempre infiere tipos y puedes 't desactivar eso en la interfaz de usuario, lo que significa
07102→7102,1250.50→1250.5, celdas vacías →nullytrue/false→ Booleanos. Grandes enteros pasados 2⁵³ stand strings, lo que guarda tus ID de Twitter. solo por coma en la interfaz, los CSV de punto y coma de European Excel ganaron 't análisis. Los encabezados duplicados son un error grave en lugar de una sobrescritura silenciosa; ese ' es una mejora genuina con respecto a la mayoría de los analizadores. Verifique la salida antes de importar y use Formateador JSON para observarlo.
¿Qué hace este convertidor realmente con sus datos?
Cada valor en un CSV es texto. 29 son los personajes 2 y 9. JSON tiene tipos reales, por lo que un convertidor tiene que decidir: es 29 el número 29 o la cuerda "29"? No hay una respuesta correcta en general, y todos los adivinos de parser de CSV.
Este adivina. Siempre. Aquí está el conjunto de reglas completo, directamente del código y verificado al ejecutarlo:
| Valor de CSV | Salida JSON | escribir a máquina |
|---|---|---|
29 |
29 |
numerarse |
07102 |
7102 |
número: el cero desapareció |
1250.50 |
1250.5 |
número: centavo desaparecido |
true / TRUE |
true |
booleano |
null / NIL |
null |
inválido |
| (celda vacía) | null |
inválido |
9007199254740993 |
"9007199254740993" |
guita |
1e3 |
1000 |
numerarse |
+5 |
"+5" |
guita |
.5 |
".5" |
guita |
NO |
"NO" |
guita |
+8801712345678 |
"+8801712345678" |
guita |
2024-01-05 |
"2024-01-05" |
guita |
Algunos de estos merecen una mirada más cercana, porque el patrón no es obvio.
El número expreso es estricto, y eso es que soporta carga. coincide ^-?\d+$ Y nada más. Por eso +5 y .5 sobrevive como cadenas, sin plus principal, sin punto decimal simple. It's también por qué +8801712345678- un número de teléfono de Bangladesh y lo pruebo con el mío - aparece intacto. Despoja eso + Y lo perderías por conversión numérica. Por lo tanto, la rigurosa express de la expresión regular es proteger accidentalmente los números de teléfono y solo los números de teléfono que mantienen su código de país Plus.
Los enteros grandes se manejan correctamente, lo que me sorprendió. Cualquier cosa fuera del rango entero seguro de JavaScript (±2⁵³−1) se mantiene deliberadamente como una cadena en lugar de convertirla y destrozarse. Sobreviven las identificaciones de copos de nieve, las ID de Twitter y las claves de base de datos de 19 dígitos. Llaman a los convertidores más ingenuos parseInt y te entrega 9007199254740992 donde tuviste ...93. Este comprueba primero el límite.
NO Se mantiene una cadena- que esquiva silenciosamente el problema de Noruega que se alimenta de archivos YAML. Formato diferente, analizador diferente, pero digno de mención: el código de país NO es una moneda de cambio de cómo lo trata un analizador de configuración, y aquí es seguro.
vacío significa nulo, no cadena vacía. Y aquí hay un pequeño error de documentación que encontré escribiendo esto: el panel de la herramienta "Cómo funciona" dice el panel "Los valores vacíos se conservan como cadenas vacías en la salida JSON." No son. inferType('') devoluciones null. El texto de la interfaz de usuario es incorrecto; el código es lo que se envía. Estoy arreglando la copia.
¿Por qué 07102 se convierte en 7102 y qué hago al respecto?
Porque un código postal no es un número y una computadora no puede decir.
07102 Coincide con "dígitos, opcionalmente negativos" perfectamente. parseInt("07102", 10) es 7102. El cero principal tenía significado era los datos y los números no tienen forma de contenerlos. Lo mismo sucede con:
- Códigos postales:
07102,01950, cualquier cosa en Nueva Inglaterra o Nueva Jersey - SKU de producto:
00451 - Números de teléfono sin más:
0171... - Códigos de enrutamiento bancario, Identificaciones de los empleados, Cualquier identificador acolchado
- dinero:
1250.50→1250.5y2100.00→2100
Vale la pena sentarse con ese último. 1250.50 y 1250.5 son el mismo número y una cadena diferente. Si va a renderizar divisa aguas abajo, $1250.5 aparecerá en alguna interfaz de usuario en algún lugar y alguien presentará un error que tardará una hora en rastrearse hasta una conversión CSV tres semanas antes. (La verdadera lección que hay es almacenar dinero en centavos enteros o en una cadena decimal, nunca en una flotación, pero eso ' es una lucha por un artículo diferente)
Ahora mismo, en esta herramienta, hay No hay que desactivar para desactivar la inferencia. La función subyacente toma una inferTypes Opción y la interfaz de usuario nunca la pasa, por lo que está activada, de forma permanente, en el valor predeterminado. Esa es una brecha, y es el elemento principal de mi lista para esta herramienta.
Hasta que se envíe, sus opciones:
- Mira la salida. En serio, es por eso que la herramienta muestra JSON en un panel en lugar de simplemente descargarlo. Escanee sus columnas de identificación. Se necesitan diez segundos y es como debería haber captado los códigos postales.
- a prueba de cotizaciones aguas arriba. Citando en el CSV won't ayuda - el analizador elimina las citas y de entonces infiere, por lo que
"07102"todavía se convierte en7102. En su lugar, haga que el valor no sea numérico en la fuente: Exportar comoZIP-07102, o agregue una columna de prefijo en la hoja de cálculo. - postproceso. Convertir, luego corrija las columnas que conoce son identificadores:
data.forEach(r => r.zip = String(r.zip).padStart(5, '0')). Feo, pero honesto y auditable. - Utilice un analizador real para tuberías reales. para cualquier cosa programada o automatizada,
csv-parseo Papa Parse en nodo concast: falsehará esto correctamente. Una herramienta de navegador es para el único.
¿Qué hace bien el analizador?
Yo ' He sido duro con eso, así que aquí ' es la otra mitad, y algo de esto es realmente mejor que lo que tú ' encontraré en otra parte.
Los encabezados duplicados son un error difícil. Aliméntalo a,b,a Y se niega: Duplicate headers found: a. La mayoría de los analizadores dejan ganar silenciosamente la última columna, por lo que una columna de datos desaparece sin una palabra. Si falla en voz alta, aquí está la llamada correcta: no puede tener dos claves con el mismo nombre en un objeto JSON y fingir lo contrario pierde datos.
Los campos cotizados se manejan correctamente, per RFC 4180. Las comas dentro de las cotizaciones permanecen puestas; "" se convierte en un literal ". Los datos de muestra se envían con "Mike, Jr." específicamente para probarlo.
Las nuevas líneas dentro de los campos cotizados funcionan. Aquí es donde normalmente muere la división CSV enrollada a mano: alguien se divide \n y un campo de dirección de varias líneas detona todo el archivo. Las pistas de divisor de filas citan el estado de carácter por carácter, por lo que "line1\nline2" se mantiene en un campo.
Se saltan las líneas en blanco, así que al final de las nuevas líneas y la fila vacía descarriada, Excel deja al final no produce objetos fantasma.
Las filas irregulares no se estrellan. Muy pocos campos y las teclas que faltan vuelven null; demasiados y los extras que superan el recuento de encabezados se eliminan silenciosamente. (Esa última parte I'd llamada discutible en lugar de correcta; una advertencia sería mejor que un descarte silencioso)
Una desviación de RFC para saber: Los valores se recortan, incluidas las comillas internas. RFC 4180 §2.4 dice que los espacios son parte del campo y no deben ignorarse, por lo que " John " debería ser " John ". Esta herramienta te da "John". Eso' es una conveniencia deliberada - el 99% de las veces que los espacios en blanco en un CSV son un accidente que desea desaparecer - pero si usted'son datos de ida y vuelta donde el relleno es significativo, es un paso con pérdidas y la especificación no está de mi lado.
¿Por qué mi análisis de punto y coma CSV no?
Porque la interfaz es de solo coma, y esto atrapa todas las exportaciones europeas.
Excel en una configuración regional que utiliza una coma como el separador decimal escribe CSV con punto y coma como delimitador de campo. Perfectamente válido, extremadamente común, y esta herramienta no la analizará. masa a;b Y obtienes una sola clave literalmente llamada a;b con el valor "1;2". No es un error 't: solo produce una columna inútil, lo cual es peor que cometer un error.
La función de análisis acepta un delimiter opción. La interfaz de usuario nunca lo expone. La misma clase de brecha que la palanca de inferencia.
Soluciones:
- encontrar y reemplazar
;→,primero en un editor de texto: seguro sólo Si ningún campo contiene una coma dentro de comillas. - con respecto a -Exportar desde Excel con "CSV UTF-8 (delimitado por comas)".
- Usa el Visor de CSV en cambio, delimita la detección al calificar la coherencia del recuento de columnas entre los delimitadores candidatos, por lo que leerá su archivo de punto y coma. Ganó 't convertir a JSON, pero ' Te mostraré lo que tienes.
Las pestañas tienen el mismo problema. También lo hace delimitado por tuberías.
¿Cómo convierto CSV a JSON en Toolz.dev?
Paso 1: Abra el convertidor
ir a la Convertidor de CSV a JSON. Los datos de muestra se cargan y ya se han convertido, por lo que puede ver la forma de inmediato.
Paso 2: Pega tu CSV
Pegar en el panel izquierdo. hay's Sin carga de archivos- it's un área de texto, así que abre tu .csv en un editor de texto y cópielo. Por unos pocos miles de filas está bien. Para una exportación de 200 MB, utilice un analizador real.
Su primera fila debe ser encabezados y necesita al menos una fila de datos. Una sola línea regresa CSV must have at least a header row and one data row.
Paso 3: Convertir
chocar Convertir a JSON. Obtienes una variedad de objetos, uno por fila, teclas de tu encabezado, sangradas en dos espacios. El recuento de filas aparece encima de la salida; compruébelo con lo que esperaba, ya que es la prueba de cordura más barata posible.
Paso 4: Lea la salida antes de confiar en ella
El paso que todos saltan y me salté una vez. Mire sus columnas de identificación. Mire sus columnas de dinero. Si aparece un código postal sin citar en el JSON, ahora es un número.
Paso 5: Copiar o descargar
número Para el portapapeles, Descargar JSON por un data.json archivo
¿Cuándo no debo usar un convertidor de navegador?
Ser honesto sobre el límite:
| colocación | aprovechamiento |
|---|---|
| Individual, unos pocos miles de filas | CSV a JSON |
| Datos confidenciales que no puedes cargar | Esto nunca sale de su navegador |
| cualquier cosa programada o automatizada | csv-parse / Papa Parse en el nodo |
| punto y coma o tabulador | Visor de CSV, o arreglar el delimitador |
| Códigos postales, SKU, ID acolchados | cualquier cosa con cast: false |
| Salida anidada de encabezados punteados | Un script: esto produce únicamente objetos planos |
| 100k+ filas | Streaming Parser; el navegador lo guarda todo en la memoria |
| yendo por el otro lado | JSON a CSV |
Vale la pena indicar claramente esa fila de "salida anidada" ya que las versiones anteriores de esta guía afirman lo contrario: encabezados como user.name y address.city tener el origen no convertirse en objetos anidados. obtienes un objeto plano con una clave literalmente llamada "user.name". There's sin expansión de notación de puntos, sin transformación de encabezado, sin conversión de camelCase. Objetos planos, claves exactamente como se escriben en su fila de encabezado: espacios, hashes y todo. Un encabezado de Order # te da una llave de "Order #", que es json legal y javascript incómodo (row["Order #"]).
La razón para acceder a esta herramienta es la misma que el resto del sitio: sus datos no ' no voy a ninguna parte. Si usted 're convierte una exportación de cliente con nombres reales y correos electrónicos, eso ' no es una pequeña cosa: pegarla en un convertidor del lado del servidor significa entregarle a un tercero un archivo de datos personales, que es una conversación con su DPO usted ' Preferiría no tenerlo. Aquí el análisis se ejecuta en su pestaña. Apague su Wi-Fi y aún funcionará.
Preguntas frecuentes
¿Por qué mi código postal perdió su cero inicial?
Porque el tipo de inferencia lo convirtió en un número y los números no pueden almacenar ceros iniciales. 07102 Coincide con el patrón "solo dígitos" y se convierte en 7102. Esto afecta los códigos postales, los SKU acolchados, las identificaciones de los empleados y cualquier identificador que resulte ser todos dígitos. Citándolo en CSV won't ayuda: las cotizaciones se eliminan antes de que se ejecute la inferencia. Verifique las columnas de su ID en la salida o prefije los valores en la fuente para que no sean numéricos.
¿Puedo desactivar la conversión de tipo automático?
No en la interfaz. La función subyacente soporta una inferTypes opción, pero la interfaz de usuario no la expone, por lo que la inferencia siempre está activada. Si necesita cadenas sin procesar, use un analizador de biblioteca como Papa Parse o csv-parse Con la fundición deshabilitada, o corrija las columnas afectadas después de la conversión.
¿Soporta coma o coma o archivos delimitados por tabuladores?
No, la interfaz es sólo de coma. Un archivo de punto y coma se analiza en una columna sin sentido en lugar de generar errores, así que tenga cuidado con eso. Reemplace los puntos y coma primero con comas (seguro solo si ningún campo citado contiene una coma), reexporte desde Excel como delimitado por comas o use CSV Viewer, que detecta delimitadores automáticamente.
¿Qué sucede con las celdas vacías?
se convierten null, no cadenas vacías. Tenga en cuenta que la herramienta 's propia "Cómo funciona " El panel actualmente dice lo contrario: el texto del panel es incorrecto y el código es correcto. Celdas que contienen el texto literal null investigaciones operacionales nil también convertirse null.
¿Puedo convertir un csv sin una fila de encabezado?
prohibido . La primera fila siempre se trata como el encabezado, y un archivo con solo una fila devuelve un error que dice que necesita un encabezado más al menos una fila de datos. Si sus datos no tienen encabezado, agregue uno en un editor de texto antes de pegarlo.
¿Maneja comas y saltos de línea dentro de los campos entre comillas?
Sí, ambos. Las pistas del analizador citan el estado carácter por carácter, por lo que un campo como "Mike, Jr." mantiene su coma y un campo entre comillas que contiene una nueva línea permanece un solo valor en lugar de dividir la fila. comillas dobles escapadas ("") convertirse en una sola cita literal, según RFC 4180.
¿Qué sucede con los nombres de columnas duplicados?
Se niega a convertir y le indica qué encabezado está duplicado. Eso ' es deliberado - un objeto JSON puede ' no tiene dos claves idénticas, por lo que la alternativa es eliminar silenciosamente una columna. Muchos analizadores hacen exactamente eso; cambie el nombre de las columnas y vuelva a convertirlas.
¿Hay un límite de fila?
Sin límite forzado, pero todo se ejecuta en la memoria de su navegador: el texto CSV, la matriz analizada y la cadena JSON formateada existen a la vez. Unos pocos miles de filas son cómodos; los recuentos de filas de seis cifras harán que la pestaña se vea afectada. Para archivos tan grandes, utilice un parser de streaming en Node en su lugar.
¿Mis datos están subidos a algún lado?
No. El análisis se realiza en su navegador y su CSV nunca se transmite, lo que lo hace seguro para las exportaciones de los clientes y otros datos que podría. ' No pegue legítimamente en una herramienta del lado del servidor. Verifique de manera fácil: abra DevTools, mire la pestaña Red mientras realiza la conversión o simplemente apague su Wi-Fi y vea que todavía funciona.
la versión corta
CSV a JSON parece la conversión más aburrida en informática y no es, porque en el momento en que un analizador decide cuáles son sus cadenas medio, puede estar mal de manera que no se anuncien. Sin error, sin advertencia, solo códigos postales de cuatro dígitos que surgen dos días después.
Entonces: Convierta, entonces Leer la salida. Compruebe las columnas que son identificadores que pretenden ser números. Si salieron sin citar, has perdido algo. Ese hábito cuesta diez segundos y me habría ahorrado un correo electrónico vergonzoso.
los Convertidor de CSV a JSON es bueno en el trabajo único: campos citados, nuevas líneas integradas, ID de enteros grandes y fallas fuertes en encabezados duplicados, todo sin que sus datos salgan del navegador. It's solo con coma, siempre infiere tipos y produce objetos planos. Ahora ya conoces los tres antes de que muerdan.
Ir en la otra dirección: JSON a CSV. Para inspeccionar un CSV desordenado primero: Visor de CSV. Para comprobar la salida: Formateador JSON. Y si sus datos se dirigen a un archivo de configuración, JSON a YAM. El recorrido más amplio es en el Guía de herramientas JSON y el Guía de herramientas de codificación.



