Aller au contenu
jsonbeautifiers
Français

CSV en JSON

Détection du délimiteur, champs entre guillemets, et inférence de types qui ne mange pas vos codes postaux.

CSV
JSON

Rien de ce que vous collez ne quitte votre navigateur. La liste d’autorisation connect-src en fait une garantie du navigateur plutôt qu’une promesse. Vérifiez-le vous-même

Convertissez du CSV en un tableau JSON d’objets, la ligne d’en-tête servant de clés. Les séparateurs sont détectés, les champs entre guillemets contenant virgules et sauts de ligne sont pris en charge, et les noms de colonne en double sont renommés plutôt que supprimés.

L’inférence de types est désactivée par défaut, et c’est délibéré.

Pourquoi chaque valeur est une chaîne tant que vous ne dites pas le contraire

L’inférence de types est l’endroit où les convertisseurs CSV détruisent des données. Un CSV n’a pas de types, le convertisseur doit donc deviner, et ses suppositions se trompent d’une façon difficile à repérer.

007 devient 7 et le code postal a disparu. Un numéro de téléphone écrit 1234567890123456789 dépasse ce qu’un nombre JavaScript peut contenir et revient différent. Un code produit comme 1E5 devient 100000. Une valeur NA devient une chaîne dans une ligne et l’en-tête d’une colonne ailleurs.

Les chaînes sont donc la valeur par défaut. Activez l’inférence quand vous connaissez vos données, et notez que même alors les zéros en tête sont préservés et que toute valeur qui ne survivrait pas à un aller-retour en float64 reste une chaîne.

Les règles du CSV qui font trébucher

Guillemets
RFC 4180 : un champ contenant une virgule, un guillemet ou un saut de ligne est entouré de guillemets doubles, et un guillemet à l’intérieur est doublé. Cet analyseur lit cela correctement, champs multilignes compris.
Séparateurs
La virgule, le point-virgule, la tabulation et la barre verticale sont détectés automatiquement en comptant les occurrences hors guillemets sur les premières lignes. L’Excel européen écrit des points-virgules.
En-têtes en double
Un objet JSON ne peut pas contenir de clés en double : un nom de colonne répété reçoit donc un suffixe et le changement est signalé. En supprimer un serait une perte de données silencieuse.
Lignes irrégulières
Une ligne comptant moins de champs que l’en-tête reçoit des null ; une ligne en comptant davantage conserve le surplus sous une clé _extra. Les deux cas sont signalés avec un numéro de ligne plutôt que réalignés en silence.
La marque d’ordre des octets
Retirée, et signalée. Laissée en place, elle devient une partie du nom de la première colonne, ce qui produit un champ mystérieusement introuvable.

Reconstruire la structure imbriquée

Si vos en-têtes sont des chemins pointés, comme dans un CSV produit par notre propre convertisseur, activez « développer les en-têtes pointés » et l’imbrication est reconstruite : address.city devient un objet imbriqué plutôt qu’une clé contenant un point.

How to do this in code

Convertir en code.

py Python

utf-8-sig retire le BOM. dtype=str est la façon d’empêcher pandas de transformer 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

Questions fréquentes

Faut-il activer l’inférence de types ?
Seulement si vous connaissez les données. Elle a raison la plupart du temps, et les exceptions sont précisément les valeurs que vous ne pouvez pas vous permettre de perdre : codes postaux, numéros de compte, références de pièces, numéros de téléphone, tout ce qui comporte un zéro en tête. Même avec l’inférence activée, cet outil les laisse tranquilles.
Pourquoi le nom de ma première colonne est-il bizarre ?
Une marque d’ordre des octets. Cet outil la retire et le dit. Un analyseur qui ne le fait pas laisse un caractère invisible au début du nom, si bien que les recherches par ce nom échouent sans raison visible.
Puis-je obtenir du NDJSON plutôt qu’un tableau ?
Convertissez ici puis passez par la page NDJSON, qui transforme un tableau en un enregistrement par ligne. C’est le meilleur format pour tout ce que vous comptez diffuser en flux ou compléter par ajout.