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
- Visiter
- Code source
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".
One choice per columnThe obvious shape
- Has to pick a destination, always
- When nothing fits it still names one, confidently
- Nothing in the answer means "none of these"
A yes/no per pair, plus a guardWhat it does
- Every pair scored on its own
- A column can score low everywhere, which is what a missing field looks like
- The guard asks directly whether it belongs nowhere
A 23 column warehouse export, end to end
- Normalise and match exactlyCase, accents, separators. Nothing that is a judgementfree
- Ask about everything left23 columns × 10 destinations, plus one guard each253 questions
- One callThe whole matrix comes back as numbers675 ms
- Apply the threshold, in your codeBest free pair first, repeat. Below the bar becomes a dropdown0.75
Mapped, and cost10 of 10, $0.0012
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

