Fusionnez deux CSV par clé et repérez les lignes sans correspondance
Fusionnez deux fichiers CSV sur une clé lorsqu’une table contient les enregistrements principaux et qu’une autre fournit des champs associés.
Lancer gratuitement
Collez les deux textes CSV, indiquez leur en-tête commun et obtenez une jointure gauche prévisible sans configurer de base de données ni écrire de script temporaire. La réponse isole également les enregistrements sans correspondance de chaque côté afin de faciliter leur contrôle. Les valeurs entre guillemets, les clés répétées, les conflits d’en-têtes et les fins de ligne courantes sont traités de manière déterministe.
Préparez deux fichiers CSV dotés d’une clé commune fiable
Commencez par repérer la colonne qui désigne le même élément dans les deux fichiers, par exemple customer_id, order_number, sku ou email. L’orthographe de l’en-tête doit correspondre exactement à la clé que vous envoyez, majuscules et espaces compris. Les autres en-têtes peuvent différer. Le CSV de gauche constitue la table principale : chacun de ses enregistrements demeure dans le résultat, qu’une correspondance existe ou non à droite. Le CSV de droite ajoute des colonnes lorsque sa clé correspond. Privilégiez un identifiant stable. Les noms et descriptions changent parfois, comportent des espaces irréguliers ou se répètent, contrairement à un identifiant système généralement plus sûr. L’analyseur accepte les champs entre guillemets, les doubles guillemets échappés, les virgules dans les valeurs protégées, les sauts de ligne intégrés, les fichiers CRLF et une marque d’ordre des octets UTF-8 initiale. Si les deux fichiers emploient un autre séparateur, fournissez ce délimiteur d’un caractère. Ils doivent utiliser le même. Les noms de colonnes vides ou dupliqués sont refusés, car ils rendraient les objets ambigus. Une erreur explicite est aussi renvoyée si l’en-tête clé manque dans l’un des CSV.
Comprenez la jointure gauche et les clés en double
Pour chaque enregistrement du CSV gauche, la capacité recherche dans le CSV droit ceux dont le texte de clé est strictement identique. Une correspondance crée un enregistrement combiné. En l’absence de correspondance, un enregistrement joint est tout de même produit : les champs gauches sont conservés et les champs provenant de droite contiennent des chaînes vides. Si le fichier droit possède plusieurs enregistrements avec la même clé, l’enregistrement gauche produit une ligne de sortie par correspondance. Cette relation un-à-plusieurs convient, par exemple, à un client associé à plusieurs abonnements ou à un produit présent dans plusieurs entrepôts, mais elle peut augmenter le nombre de lignes. Les clés dupliquées à gauche sont traitées séparément et gardent leur ordre initial. Les lignes et correspondances suivent l’ordre des sources, ce qui assure un résultat déterministe. La clé commune n’apparaît qu’une fois. Si un en-tête droit autre que la clé existe déjà à gauche, il reçoit le préfixe right_ afin qu’aucune valeur ne soit écrasée. D’autres préfixes sont ajoutés au besoin. Le tableau columns fournit l’ordre et les noms définitifs avant que vous n’exploitiez joined_rows.
Réconciliez vos données grâce aux rapports de non-correspondance
Le tableau unmatched_left contient les enregistrements gauches d’origine dont la clé n’a aucun équivalent à droite. Ils figurent toujours dans joined_rows puisqu’il s’agit d’une jointure gauche, mais cette liste distincte vous permet de les orienter vers une correction, un enrichissement ou une vérification. Le tableau unmatched_right contient les enregistrements droits que n’a utilisés aucune ligne gauche. Absents de la table jointe, ils signalent souvent des données de référence obsolètes, de nouveaux identifiants inattendus ou un fichier provenant de la mauvaise période. Les compteurs récapitulent la taille des sources, celle du résultat développé et les totaux sans correspondance, ce qui simplifie les contrôles automatisés. Un processus peut refuser une importation si unmatched_left dépasse zéro ou déclencher une alerte lorsque unmatched_right franchit un seuil. La comparaison est stricte : elle ne supprime pas les espaces, ne normalise pas la casse et ne réinterprète pas les nombres. Ainsi, 001, 1 et 1 suivi d’une espace restent distincts. Cette prudence évite les associations accidentelles. Normalisez les clés en amont uniquement si vos règles métier autorisent leur équivalence. Pour $0.002 par requête via l’API, cette opération convient aux imports récurrents comme aux analyses ponctuelles.
Cas d’usage
Enrichissez les exports clients
Ajoutez une offre, un territoire ou un responsable depuis un CSV de référence tout en conservant chaque client principal.
Rapprochez commandes et paiements
Reliez les transactions par numéro de commande et repérez les commandes impayées ou les paiements sans commande connue.
Contrôlez la couverture du catalogue
Associez la liste maîtresse des SKU aux données fournisseur, puis détectez les produits incomplets et les lignes inutilisées.
Questions fréquentes
Que se passe-t-il si la colonne clé manque ?
La requête échoue avec une erreur d’entrée précisant si la clé manque dans le CSV gauche ou droit.
L’opération conserve-t-elle toutes les lignes de gauche ?
Oui. C’est toujours une jointure gauche ; les champs droits d’une ligne sans correspondance sont des chaînes vides.
Comment les clés en double sont-elles traitées ?
Chaque enregistrement gauche est combiné à tous les enregistrements droits correspondants, ce qui peut créer plusieurs lignes.
Que faire si les deux fichiers ont une colonne du même nom ?
La colonne gauche garde son nom et celle de droite reçoit le préfixe right_, complété si nécessaire.
Les clés sont-elles nettoyées avant la comparaison ?
Non. La comparaison stricte conserve espaces, casse et zéros initiaux ; normalisez les valeurs au préalable si besoin.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/data/merge-csv-on-key \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"left_csv":"id,name\n1,Ada\n2,Linus\n3,Grace","right_csv":"id,team\n1,Research\n2,Platform\n4,Support","key":"id"}'const res = await fetch("https://api.kit.forhosting.com/data/merge-csv-on-key", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"left_csv": "id,name\n1,Ada\n2,Linus\n3,Grace",
"right_csv": "id,team\n1,Research\n2,Platform\n4,Support",
"key": "id"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/merge-csv-on-key",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"left_csv": "id,name\n1,Ada\n2,Linus\n3,Grace",
"right_csv": "id,team\n1,Research\n2,Platform\n4,Support",
"key": "id"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/merge-csv-on-key", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"left_csv":"id,name\\n1,Ada\\n2,Linus\\n3,Grace","right_csv":"id,team\\n1,Research\\n2,Platform\\n4,Support","key":"id"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"left_csv":"id,name\n1,Ada\n2,Linus\n3,Grace","right_csv":"id,team\n1,Research\n2,Platform\n4,Support","key":"id"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/merge-csv-on-key", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"left_csv": "id,name\n1,Ada\n2,Linus\n3,Grace",
"right_csv": "id,team\n1,Research\n2,Platform\n4,Support",
"key": "id"
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.merge_csv_on_key",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_mb | 25 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |