Convertir XLSX en NDJSON

Vous pouvez convertir XLSX 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é.
  • Reconstruit NDJSON ne fonctionne pas comme XLSX. Il ne s’agit donc pas de la dégradation progressive d’un codec avec perte : ce que NDJSON sait exprimer est reproduit fidèlement, et ce qui n’y a pas d’équivalent ne subsiste pas du tout.
  • Limite de taille Jusqu’à 100 Mo par fichier, gratuitement et sans compte.
  • Bon à savoir Seule la première feuille est lue, et seulement ses valeurs. Formules, mise en forme, largeurs de colonnes et toutes les feuilles suivantes restent de côté.

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

Pourquoi quelque chose veut des enregistrements un par ligne

Un tableau JSON est une valeur unique. Pour lire le dernier objet dedans, vous devez avoir analysé tout ce qui le précède, ce qui signifie tenir tout le document en mémoire ou aller chercher un analyseur en flux qui comprend des structures partielles. Pour un fichier de configuration c’est sans importance. Pour quatre millions de lignes, c’est la différence entre un import qui marche et un processus que le système d’exploitation tue.

Le JSON délimité par des sauts de ligne retire le problème en retirant le conteneur. Chaque ligne est une valeur JSON complète et indépendante, donc un consommateur lit une ligne, en fait quelque chose, la jette et continue avec une empreinte mémoire constante. Cette seule propriété est la raison pour laquelle les chargeurs en masse, les expéditeurs de journaux et les travaux d’ingestion en entrepôt ont tous convergé vers la même forme. C’est aussi pourquoi un chargement raté est récupérable. Un flux qui échoue à l’enregistrement huit cent mille peut être repris depuis cette ligne, là où un document qui échoue à l’analyse ne vous donne rien du tout et aucune indication de l’enregistrement responsable.

Une ligne est un enregistrement, garanti

La garantie ne tient que si rien dans les données ne peut produire son propre saut de ligne, et cette conversion l’applique. Une cellule contenant un saut de ligne — une adresse sur plusieurs lignes, un commentaire tapé avec Alt+Entrée — est écrite avec le saut de ligne échappé à l’intérieur de la chaîne JSON, donc l’enregistrement reste sur une ligne. Une tabulation à l’intérieur d’une cellule est échappée de la même manière.

C’est l’avantage concret sur un fichier délimité. Un export séparé par des tabulations de la même feuille doit envelopper une cellule gênante dans des guillemets et espérer que le lecteur implémente la convention ; ici, il n’y a rien à implémenter. Découper le fichier en morceaux de dix mille lignes est sûr, compter les lignes vous donne le nombre d’enregistrements, et aucune ligne ne peut être corrompue par celle du dessus. La comparaison est concrète : la même cellule contenant une tabulation est écrite ici comme un échappement dans une chaîne JSON entre guillemets, et dans un export séparé par des tabulations comme un champ enveloppé dans des guillemets droits que les outils shell ne comprennent pas. L’une est gérée par chaque analyseur JSON jamais écrit et l’autre est un ticket d’assistance.

Les types que le tableur connaissait, écrits en toutes lettres

Un fichier délimité a un seul type : le texte. Ce qui le lit doit deviner, et deviner, c’est là que des identifiants deviennent des entiers et que des numéros de version deviennent des décimaux. JSON porte la distinction explicitement, donc une quantité est écrite 12, un drapeau true, une valeur manquante null, et un code produit qui était du texte dans le classeur reste entre guillemets avec ses zéros initiaux intacts.

Pour un chargement vers une destination typée, cela représente du vrai temps. Le schéma que vous déclarez et les valeurs que vous fournissez s’accordent sans couche de coercition entre les deux, et un job d’ingestion qui rejette une ligne vous dit quel champ est en désaccord plutôt que de signaler une erreur d’analyse sur un numéro de ligne. Les types viennent du classeur plutôt que d’une inférence sur le texte, ce qui est la partie importante. Une cellule qu’Excel tenait comme nombre est écrite ici comme nombre parce qu’elle en était une, pas parce qu’un analyseur a regardé les caractères et a décidé qu’ils ressemblaient à un.

Ce que coûte la forme auto-descriptive

Chaque ligne répète chaque clé. Cinquante mille lignes de six colonnes signifient cinquante mille copies des six noms de champ, ce qui sur une vraie feuille donnait environ 4,4 Mo contre 1,8 Mo pour les mêmes données en texte séparé par des tabulations — environ deux fois et demie, à partir d’un .xlsx d’environ 4,3 Mo.

Ce compromis est en général correct pour cette destination, parce que le fichier va être lu une fois par une machine plutôt que stocké pour toujours. Si les mêmes enregistrements vont être interrogés à plusieurs reprises, la forme à viser est en colonnes plutôt qu’orientée ligne, et la même feuille atterrit à une petite fraction de la taille. NDJSON est un format de transport, pas un format de stockage. En transit, la taille n’importe en général pas non plus, parce que le fichier se compresse extrêmement bien : les clés répétées sont la chose la plus compressible dedans, et gzip sur le chemin d’un magasin d’objets retire presque tout le surcoût que cette section décrit.

Traiter le fichier sans l’ouvrir

Les outils découlent de la forme. `wc -l` vous donne le nombre exact de lignes, parce qu’il y a un enregistrement par ligne et un saut de ligne à la fin. `head -1` vous montre les noms des champs tels qu’ils ont été réellement écrits plutôt que tels que vous vous en souvenez. `split -l 10000` produit des morceaux qui sont chacun valides seuls.

Pour tout ce qui est au-delà, jq lit un flux de valeurs plutôt qu’un document, donc `jq -c "select(.qty > 100)"` filtre un fichier plus grand que la mémoire et émet la même forme que celle qu’il a consommée. Cette composabilité est la raison de convertir vers cette forme plutôt que vers un tableau qu’il faudrait démonter à nouveau. C’est aussi le moyen le moins cher d’inspecter un tableur que quelqu’un vous a envoyé. Une commande vous donne les noms des champs, une autre vous donne le nombre de lignes, et une troisième vous montre chaque valeur distincte dans une colonne — aucune de ces choses n’exige d’ouvrir le classeur ni de faire confiance à ce que son premier écran semble dire.

Ce qu’une API en masse attend par-dessus cela

Toute API qui dit JSON délimité par des sauts de ligne ne signifie pas seulement cela. Les requêtes en masse d’Elasticsearch et d’OpenSearch intercalent une ligne d’instruction avant chaque document, donc le corps fait deux fois plus de lignes qu’il n’y a d’enregistrements et cette sortie est la matière première plutôt que la charge utile. Générer les lignes d’action est quelques lignes de script sur le fichier.

Les chargeurs qui prennent le format tel quel existent et sont le cas courant : un job de chargement en entrepôt pointé vers du JSON délimité par des sauts de ligne, un producteur de file lisant une ligne par message, la routine d’import propre d’une application. Vérifiez la documentation de la destination pour savoir si elle veut des enregistrements ou un corps de requête, parce que les deux se ressemblent assez pour faire perdre un après-midi. La question discriminante est de savoir si la description du format mentionne une ligne d’action ou de métadonnées. Si oui, on vous demande un protocole et ce fichier est la moitié payload ; si elle ne décrit que les enregistrements, cette sortie entre telle quelle.

Le champ de date que votre chargeur acceptera sans se plaindre

Les dates dans un tableur sont des comptes de jours portant un format d’affichage, et la conversion écrit la valeur plutôt que l’apparence : 1er janvier 2024 devient 45292, et un horodatage devient ce nombre avec une fraction pour l’heure. Le compte commence à fin décembre 1899.

C’est le mode de défaillance à surveiller sur cette paire spécifiquement, parce que les nombres JSON sont légitimes et qu’un chargeur avec une colonne numérique prendra 45292 avec plaisir et ne vous dira rien. Convertissez ces champs délibérément — dans une étape jq sur le fichier, ou dans la cible après chargement — et faites-en une partie du pipeline plutôt que quelque chose que vous remarquerez dans un tableau de bord six semaines plus tard.

Nulls, lignes irrégulières et quelle feuille est utilisée

Une cellule vide est écrite comme null plutôt qu’omise, donc chaque objet porte les mêmes clés et un consommateur attendant une forme fixe en obtient une. Là où des lignes ultérieures introduisent un champ que les premières n’avaient pas, l’ensemble des clés est l’union à travers la feuille, donc rien n’est écarté pour être apparu tard.

Seule la première feuille du classeur est convertie, parce qu’un flux d’enregistrements n’a aucun moyen d’exprimer « et maintenant une table différente ». Si la feuille qu’il vous faut n’est pas la première, réordonnez le classeur et convertissez à nouveau ; s’il vous en faut plusieurs, convertissez plusieurs fois et chargez-les comme flux séparés, ce que la destination voudra de toute façon.

Où la conversion tourne, et combien elle prendra

Tout se passe dans votre navigateur. Le classeur est analysé et les lignes sont écrites localement, sans téléversement et sans file — ce qui pour un export de fiches clients, de commandes, ou quoi que ce soit sous une politique de protection des données est la différence entre un outil que vous pouvez utiliser au travail et un que vous ne pouvez pas.

Le plafond est de 100 Mo par classeur et 100 fichiers par dépôt, le même pour tout le monde et pas un palier à dépasser en payant. Bien avant ce chiffre, c’est la mémoire que vous sentirez, parce que la feuille est lue dans un tableau avant d’être écrite : quelques dizaines de mégaoctets est sans histoire, et un classeur proche du plafond est là où un onglet de navigateur commence à peiner. Au-delà, le bon instrument est un lecteur en flux dans un script, et il est plus utile de le dire que d’échouer aux trois quarts d’un très gros fichier.

Quand un tableau ou un stockage en colonnes battent un flux

Si le consommateur est un programme qui lira le fichier entier et le passera à autre chose — une fixture, un script de seed, un corps de requête — un tableau JSON est la forme qu’il attend, et NDJSON n’ajoute qu’une étape d’assemblage. Convertissez en JSON dans ce cas.

Si les enregistrements vont être interrogés à plusieurs reprises plutôt que chargés une fois, convertissez en Parquet : mêmes lignes, une fraction des octets, et une requête qui touche deux champs lit deux colonnes au lieu de chaque ligne. NDJSON est la bonne réponse tant que les données bougent, et c’est une mauvaise réponse une fois arrivées.

Comment convertir XLSX en NDJSON

  1. Déposez votre fichier XLSX 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é.

XLSX et NDJSON : ce qui change

XLSX face à NDJSON
XLSXNDJSON
Nom completClasseur ExcelNewline-Delimited JSON
Extension de fichier.xlsx.ndjson, .jsonl
Type de médiaapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetapplication/x-ndjson
Première publication20072013
Publié parMicrosoft
SpécificationECMA-376
LicenceStandard ouvertStandard ouvert
Situation actuelleActuelActuel
S’ouvre dans un navigateurAucun navigateurAucun navigateur
Envisagé à la placeCSV, ODS, ParquetJSON, CSV

Ouvrir le résultat

Les logiciels habituels ne se recoupent pas : XLSX s’ouvre dans Microsoft Excel, LibreOffice Calc et Google Sheets, NDJSON dans jq et pandas — celui qui reçoit le résultat a donc besoin d’un logiciel de la seconde liste.

À quoi sert chaque format

Les deux visent des usages différents : XLSX la retouche, NDJSON l’échange entre programmes et la diffusion en continu. Cela mérite d’être pesé avant, car ce qui justifie l’un est souvent ce qui rend l’autre malcommode.

XLSX est le format de Microsoft, publié en 2007. La spécification est ECMA-376, 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.

De XLSX à NDJSON : questions fréquentes

Mon fichier XLSX 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. Le moteur de cette paire précise est SheetJS, un lecteur et générateur de tableurs en JavaScript ; votre navigateur le télécharge une fois puis le garde en cache.

Convertir XLSX 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. SheetJS est téléchargé sur votre machine et s’y exécute, et c’est pourquoi rien n’est compté.

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

XLSX et NDJSON décrivent le contenu de façons radicalement différentes. La conversion est donc une reconstitution et non une copie : fidèle, mais pas identique octet pour octet. Seule la première feuille est lue, et seulement ses valeurs. Formules, mise en forme, largeurs de colonnes et toutes les feuilles suivantes restent de côté.

Dois-je installer quelque chose pour ouvrir un fichier NDJSON ?

Pas pour la conversion : elle se fait dans le navigateur que vous avez déjà ouvert. Pour ouvrir le résultat, il vous faut ensuite le logiciel avec lequel votre appareil affiche habituellement Newline-Delimited JSON.

En savoir plus sur ces formats