Convertir CSV en NDJSON

Vous pouvez convertir CSV en NDJSON gratuitement et sans compte : déposez le fichier ci-dessus et, une ou deux secondes plus tard, le résultat est prêt à télécharger. La conversion se fait dans votre propre navigateur : le fichier n’est donc jamais téléversé. Cela marche sous Windows, macOS et Linux comme sur iPhone et Android, et continue de marcher si vous coupez le réseau.

  • Où cela s’exécute Dans votre navigateur. Le fichier n’est pas téléversé.
  • Sans perte Rien ne se perd. NDJSON contient exactement ce que contenait CSV.
  • Limite de taille Jusqu’à 100 Mo par fichier, gratuitement et sans compte.

Jusqu’à 100 fichiers à la fois. Les formats mélangés ne posent pas de problème.

La ligne d’en-tête se déplace dans chaque ligne

Un CSV nomme ses colonnes une fois, en haut, et chaque ligne ensuite est positionnelle — le troisième champ est la ville parce que le troisième en-tête l’a dit. Le NDJSON fait l’inverse : chaque ligne est un objet complet portant ses propres clés, donc la soixante-dix-millième fiche est aussi lisible isolément que la première.

C’est le compromis que fait la conversion, et il n’est pas gratuit. Répéter les noms de clés à chaque ligne grossit le fichier, parfois considérablement sur une table de valeurs courtes avec des en-têtes longs. Ce que vous y gagnez, c’est qu’aucune ligne ne dépend d’une autre, et c’est ce qui rend possibles toutes les autres propriétés de cette page.

Deux exports CSV qui ne sont pas d’accord sur leurs colonnes

La raison pour laquelle cette conversion est généralement demandée, ce n’est pas l’élégance. C’est que vous avez onze exports mensuels, le système a ajouté un champ en avril, et il n’y a aucun moyen de concaténer un fichier à quatorze colonnes avec un fichier à quinze. Joindre les CSV laisse une ligne d’en-tête au milieu des données, et même après l’avoir retirée, les champs ne sont plus alignés.

Le NDJSON n’a pas ce problème. Des enregistrements avec des jeux de clés différents coexistent dans le même fichier tout à fait légitimement, et tout consommateur raisonnable — un moteur de requête, un job de chargement, un script — traite une clé manquante comme absente plutôt que comme une fiche cassée. Convertissez chaque export séparément, concaténez les résultats avec `cat`, et la différence de schéma devient un fait sur des fiches individuelles au lieu d’une défaillance structurelle.

Découper, ajouter, reprendre un export converti

Parce qu’un enregistrement se termine là où la ligne se termine, le fichier peut être coupé partout où il y a un saut de ligne et les deux moitiés restent valides. `split -l 100000` produit des chunks chargeables. `head -n 1000` produit un échantillon que vous pouvez réellement passer contre un schéma. Un chargement échoué peut être repris à partir d’un numéro de ligne plutôt que recommencé.

Ajouter fonctionne pour la même raison : de nouveaux enregistrements vont à la fin avec `>>` et rien au-dessus n’a besoin d’être réécrit. Faire l’équivalent sur un CSV demande de vérifier si l’en-tête est présent, si l’ordre des colonnes correspond, et si la dernière ligne se terminait par un saut de ligne, et se tromper sur l’un de ces points corrompt le fichier silencieusement plutôt que bruyamment.

Les types viennent du parseur CSV, et il devine

JSON distingue le nombre 7 de la chaîne « 7 » et un CSV ne le fait pas, donc quelque chose doit décider, et ce qui décide c’est l’inférence sur le texte. Les valeurs qui se parsent comme des nombres deviennent des nombres JSON — `1e5` arrive en sortie comme 100000 — tandis que `true` et `false` deviennent des booléens et que tout le reste reste une chaîne.

La supposition est correcte pour les quantités, les prix et les indicateurs, et fausse pour les identifiants. `007` devient `7`, et une fois que c’est un nombre dans le JSON, il n’y a plus rien pour le récupérer. Si l’export contient des codes plutôt que des mesures, la parade la moins coûteuse est de les rendre non ambigus dans la source : un préfixe, ou une colonne déjà exportée en texte, les deux survivent. Le test général est de savoir si additionner deux valeurs de la colonne aurait un sens ; si non, c’est un identifiant et il voulait rester une chaîne.

Un champ CSV vide devient null

Une cellule vide est écrite `null` plutôt que comme une chaîne vide. C’est une décision réelle et qui mérite d’être connue, parce que les deux ne sont pas la même chose pour tout ce qui consomme le fichier : un schéma JSON avec `"type": "string"` rejette null, et un chargement en base mettra un null là où vous attendiez peut-être la chaîne vide que vous voyiez dans la source.

Ce que la conversion ne peut pas faire, c’est vous dire laquelle des deux l’export voulait dire. Un CSV a exactement une façon d’écrire « rien ici » et elle est utilisée à la fois pour « ce champ est vide » et « ce champ ne s’applique pas ». Si la distinction compte en aval, elle doit être encodée explicitement dans la source — une valeur sentinelle, ou une seconde colonne — avant qu’une conversion la voie.

Lire le résultat avec jq et autres outils ligne à ligne

Le fichier est conçu pour `jq -c`, qui le lit une valeur à la fois sans tenir l’ensemble en mémoire. `jq -r ".city"` sur un export converti imprime une ville par ligne ; `jq -s "length"` compte les enregistrements ; un filtre `select` produit un fichier NDJSON plus petit qui reste lui-même un fichier NDJSON valide.

La même chose s’applique à tout ce qui lit des lignes. `grep` sur le fichier brut fonctionne et est honnête, parce qu’un enregistrement ne peut pas s’étendre sur deux lignes et ne peut pas être coupé en deux par une correspondance. `wc -l` donne le compte exact d’enregistrements, ce qui est un détail jusqu’à ce que vous le compariez au fait de compter des lignes d’un CSV où une adresse entre guillemets contient un saut de ligne.

Combien de fois plus gros le NDJSON est que le CSV

Attendez-vous à grossir. Chaque ligne répète les noms de clés, chaque chaîne est entre guillemets, et la ponctuation d’un objet est ajoutée autour des valeurs. Sur une table de codes courts avec des en-têtes descriptifs, le fichier peut doubler ; sur une table de longs champs de texte libre, la différence est faible, parce que les valeurs dominent.

La compression referme l’essentiel de l’écart, puisque les clés répétées sont exactement ce qu’un compresseur traite le mieux, et un NDJSON gzippé est en général proche d’un CSV gzippé des mêmes données. Si la taille au repos est ce qui compte vraiment, plutôt que la forme diffusable, c’est un signal pour regarder Parquet, où les noms de colonnes sont stockés une fois dans un pied de page plutôt qu’à chaque enregistrement.

Ce qui doit encore se passer avant qu’un chargement accepte le fichier

Le NDJSON est une forme de conteneur, pas un contrat. Une destination qui ingère des lignes JSON aura quand même des opinions sur les noms de champs, sur les formats de date, et sur la question de savoir si un null est permis à une position donnée, et aucune de ces opinions n’est tranchée par cette conversion.

Les deux qui piègent les gens sont les dates et les identifiants. Une date dans un CSV est du texte et reste du texte, donc la chaîne qu’a choisie le système exportateur est ce qui arrive — et si cette chaîne est `03/04/2024`, l’ambiguïté voyage avec. Les identifiants, comme ci-dessus, peuvent être devenus des nombres. Les deux se règlent à peu de frais par un `jq` d’une ligne sur le fichier converti, et beaucoup plus cher après le chargement.

L’export est parsé sur cette page, pas sur un serveur

Lire le CSV et écrire les lignes JSON sont du JavaScript ordinaire, chargé par cette page à la demande. Aucune requête ne transporte le fichier, donc un export client nocturne ou un extrait financier peut être converti sans devenir la copie de quelqu’un d’autre.

L’offre gratuite s’arrête à 100 Mo par fichier, et en deçà le plafond est la mémoire. La table entière est construite avant que quoi que ce soit soit écrit, ce qui met des dizaines de mégaoctets confortément à portée et les derniers pas vers 100 Mo au point où un onglet de navigateur commence à peiner. Pour un export plus gros, un lecteur CSV en flux dans un script est le bon outil — et la destination étant un flux, écrire ce script est souvent l’état final correct.

Quand JSON, CSV ou Parquet est la meilleure destination

Choisissez un tableau JSON brut à la place quand l’ensemble va être chargé en une fois par quelque chose qui attend un tableau — une charge utile d’API, une fixture de test, un fichier de configuration. Le NDJSON y est pire qu’inutile, parce que la plupart des parseurs JSON le rejetteront dès la deuxième ligne.

Gardez le CSV si la destination est un tableur ou un écran d’import qui le nomme, parce que ni l’un ni l’autre ne gagne quoi que ce soit à avoir des enregistrements sur des lignes. Et choisissez Parquet quand les mêmes données seront interrogées de manière répétée plutôt qu’ingérées une fois : il stocke les noms de colonnes une fois, garde les types explicitement au lieu de les inférer, et tient en une fraction de la place sur disque.

Comment convertir CSV en NDJSON

  1. Déposez votre fichier CSV sur cette page, ou cliquez pour en choisir un.
  2. Choisissez NDJSON comme destination. La conversion se fait dans votre navigateur et le fichier n’est pas téléversé.
  3. Téléchargez le fichier NDJSON terminé.

CSV et NDJSON : ce qui change

CSV face à NDJSON
CSVNDJSON
Nom completComma-Separated ValuesNewline-Delimited JSON
Extension de fichier.csv.ndjson, .jsonl
Type de médiatext/csvapplication/x-ndjson
Première publication19722013
SpécificationRFC 4180
LicenceStandard ouvertStandard ouvert
Situation actuelleActuelActuel
S’ouvre dans un navigateurAucun navigateurAucun navigateur
Envisagé à la placeXLSX, JSON, ParquetJSON

Ce qui est conservé

Rien n’est écarté. CSV et NDJSON enregistrent leur contenu sans perte : la conversion change l’emballage, pas la qualité, et elle peut être répétée sans que les dégâts s’accumulent.

Ouvrir le résultat

pandas lit aussi bien CSV que NDJSON : vous pouvez comparer le résultat à l’original sans second logiciel.

À quoi sert chaque format

CSV a ete publié en 1972. La spécification est RFC 4180, et elle mérite d’être connue si le fichier doit survivre à l’outil qui l’a écrit.

NDJSON date de 2013. jq et pandas le lisent.

CSV a été publié en 1972 et NDJSON en 2013. Le plus ancien est en général le fichier le plus sûr à remettre ; le plus récent fait le même travail en moins d’octets.

De CSV à NDJSON : questions fréquentes

Mon fichier CSV est-il téléversé quelque part ?

Non. Cette conversion se fait entièrement dans votre navigateur : le fichier ne quitte donc pas votre appareil. Vous pouvez le vérifier vous-même — ouvrez l’onglet réseau des outils de développement et convertissez quelque chose. Vous verrez la page elle-même et les requêtes de statistiques et de publicité qui financent ce service, et pas une seule qui transporte votre fichier.

Convertir CSV en NDJSON est-il gratuit ?

Oui. Pas de compte, pas de filigrane et pas de quota journalier à dépenser : cela tourne sur votre propre machine, vous pouvez donc revenir autant de fois que vous voulez. Le navigateur traite des fichiers jusqu’à 100 Mo, 100 à la fois.

Y a-t-il une perte de qualité en convertissant CSV en NDJSON ?

Non. NDJSON enregistre le même contenu sans rien jeter : le résultat est identique en qualité à l’original.

La conversion de CSV à NDJSON est-elle sans perte ?

Rien n’est écarté. CSV et NDJSON enregistrent leur contenu sans perte : la conversion change l’emballage, pas la qualité, et elle peut être répétée sans que les dégâts s’accumulent.

En savoir plus sur ces formats