Guillaume Duvernay

Open source

jev-table-import-mapper

Vos utilisateurs importent un CSV. Leurs colonnes ne sont jamais les vôtres.

Une petite bibliothèque JavaScript pour l'écran d'importation que tout produit finit par créer. Elle fait correspondre les colonnes d'un fichier importé à votre table de destination, renvoie une probabilité pour chaque correspondance et signale celles dont elle n'est pas sûre. Deux fichiers, aucune dépendance.

Rôle
Auteur
Année
2026
Stack
JavaScript, OpenRouter, Jev

Le code d'abord, et seulement pour ce que le code peut régler

La première étape normalise la casse, les accents et les séparateurs, puis effectue une correspondance sur égalité stricte. « First Name » et « first_name » sont le même mot écrit différemment, ce couple est donc verrouillé gratuitement et ne peut être erroné. « Company Name » et « company » ne sont pas le même mot, tout comme « team » et « department » : ce sont des questions, elles passent donc à l'étape suivante. Sur un export HubSpot propre, cela règle 7 colonnes sur 10 avant tout appel réseau.

Un seul appel pour tout le reste, sous forme de matrice

La deuxième étape pose une question oui/non indépendante par paire restante, plutôt qu'un choix multiple par colonne, avec une question de contrôle pour savoir si une colonne ne correspond à rien. C'est un choix de conception. Un choix multiple doit désigner un gagnant même si rien ne correspond : une matrice peut afficher un score bas partout, ce qui correspond à un champ manquant. Un export de 23 colonnes face à une table de 10 colonnes représente 253 questions, un seul appel, 675 ms et environ un dixième de centime.

La décision reste dans votre code

L'appel renvoie la matrice complète, pas un verdict. Le seuil est une constante que vous ajustez, pas un comportement que vous demandez via un prompt. Tout ce qui est en dessous devient un menu déroulant classé plutôt qu'une supposition. Puisque le chiffre existe, l'interface peut l'afficher : une correspondance à 81 % ne se lit pas comme une correspondance à 98 %.

Les limites

Testé sur neuf exports réels face à trois tables de destination de dix colonnes chacune. Un schéma de destination d'environ 40 colonnes nécessiterait plus d'un appel, et le second budget dans la fenêtre de contexte du modèle ne se divise pas. Une table très large est donc une limite matérielle plutôt qu'un ralentissement. Je ne l'ai pas testé.

The shape of the questions is the whole thing

One yes/no per pair, not one multiple choice per column. It sounds like a detail and it decides whether the library can say "this column belongs nowhere".

Roughly a third of the columns on a real export belong nowhere in your table. Only the second shape can say so.

A 23 column warehouse export, end to end

Twenty-one times the questions costs 1.45 times the wait: 12 questions take 464 ms and 253 take 675. If each question were its own call this file would be a two minute wait.

7 of 10colonnes réglées via le code, avant tout appel

675 mspour 253 questions en un seul appel

$0.0012pour mapper un export d'entrepôt de 23 colonnes