Unisca due CSV per chiave e trovi le righe senza corrispondenza
Unisca due file CSV tramite una chiave quando una tabella contiene i record principali e l’altra aggiunge campi correlati.
Esegui gratis nel browser
Incolli entrambi i testi CSV, indichi l’intestazione condivisa e ottenga un join sinistro prevedibile senza configurare un database né scrivere uno script temporaneo. La risposta separa anche i record senza corrispondenza di entrambi i lati, agevolandone il controllo. Valori tra virgolette, chiavi ripetute, conflitti tra intestazioni e terminatori di riga comuni vengono gestiti in modo deterministico.
Prepari due file CSV con una chiave condivisa affidabile
Individui innanzitutto la colonna che rappresenta lo stesso elemento in entrambi i file, ad esempio customer_id, order_number, sku oppure email. L’intestazione deve coincidere esattamente con il valore della chiave inviato, incluse maiuscole e spazi. Le altre intestazioni possono essere diverse. Il CSV sinistro è la tabella principale: ogni suo record rimane nel risultato unito, anche quando non esiste una corrispondenza a destra. Il CSV destro fornisce colonne aggiuntive quando la chiave coincide. Scelga possibilmente un identificatore stabile. Nomi e descrizioni possono cambiare, contenere spazi incoerenti o ripetersi, mentre un identificatore di sistema è in genere più sicuro. Il parser supporta campi tra virgolette, virgolette doppie con escape, virgole nei valori tra virgolette, ritorni a capo incorporati, file CRLF e un byte-order mark UTF-8 iniziale. Se entrambi i file utilizzano un altro separatore, specifichi quel delimitatore di un solo carattere. I due input devono usare lo stesso delimitatore. Le intestazioni vuote o duplicate vengono rifiutate perché renderebbero ambigui gli oggetti risultanti. La capacità restituisce inoltre un errore chiaro se l’intestazione chiave manca in uno dei CSV.
Comprenda il join sinistro e le chiavi duplicate
Per ciascun record del CSV sinistro, la capacità cerca nel CSV destro i record con un testo della chiave esattamente uguale. Una singola corrispondenza genera un record combinato. Se non vi sono corrispondenze, viene comunque prodotto un record unito: i campi sinistri originali restano invariati e ogni campo proveniente da destra diventa una stringa vuota. Quando il file destro contiene più record con la stessa chiave, il record sinistro si espande in una riga di output per ogni corrispondenza. Questa relazione uno-a-molti è utile per collegare un cliente a più abbonamenti o un prodotto a più magazzini, ma può aumentare il numero di righe. Le chiavi duplicate a sinistra vengono elaborate separatamente e mantengono l’ordine originale. Righe e corrispondenze rispettano l’ordine delle fonti, garantendo risultati deterministici. La chiave condivisa compare una sola volta. Se un’intestazione destra diversa dalla chiave esiste già a sinistra, riceve il prefisso right_ per non sovrascrivere alcun valore. Se serve, vengono aggiunti altri prefissi. L’array columns mostra l’ordine e i nomi finali esatti prima che Lei utilizzi joined_rows.
Utilizzi i report delle righe non abbinate per riconciliare i dati
L’array unmatched_left contiene i record sinistri originali la cui chiave non ha trovato corrispondenza a destra. Queste voci rimangono in joined_rows perché si tratta di un join sinistro, ma l’elenco separato consente di inviarle a correzione, arricchimento o revisione. L’array unmatched_right raccoglie i record destri originali mai utilizzati da una riga sinistra. Non compaiono nella tabella unita, ma spesso rivelano dati di riferimento obsoleti, identificatori nuovi inattesi o un file relativo al periodo sbagliato. I conteggi riassumono le dimensioni delle fonti, il risultato espanso e i totali senza corrispondenza, facilitando i controlli automatici. Un flusso può rifiutare un’importazione quando unmatched_left è maggiore di zero oppure avvisare quando unmatched_right supera una soglia. Il confronto è esatto e non elimina spazi, non normalizza maiuscole e minuscole e non reinterpreta numeri: 001, 1 e 1 seguito da uno spazio restano quindi distinti. Questa regola prudente evita associazioni accidentali. Normalizzi le chiavi prima della chiamata soltanto se le regole aziendali consentono di considerarle equivalenti. A $0.002 per richiesta tramite API, l’operazione si adatta sia alle importazioni ricorrenti sia alle verifiche occasionali.
Casi d'uso
Arricchisca le esportazioni clienti
Aggiunga piano, territorio o responsabile da un CSV di riferimento conservando ogni cliente dell’esportazione principale.
Riconcili ordini e pagamenti
Unisca le transazioni per numero d’ordine e individui ordini non pagati o pagamenti collegati a ordini sconosciuti.
Verifichi la copertura del catalogo
Combini l’elenco principale degli SKU con i dati del fornitore e rilevi prodotti incompleti e righe inutilizzate.
Domande frequenti
Cosa succede se manca la colonna chiave?
La richiesta non riesce e un errore di input indica se la chiave manca nel CSV sinistro o in quello destro.
L’operazione conserva tutte le righe a sinistra?
Sì. È sempre un join sinistro; una riga non abbinata riceve stringhe vuote nei campi provenienti da destra.
Come vengono gestite le chiavi duplicate?
Ogni record sinistro viene combinato con tutti i record destri corrispondenti e può quindi produrre più righe.
Cosa avviene se i file hanno una colonna con lo stesso nome?
La colonna sinistra conserva il nome; quella destra riceve il prefisso right_, ripetuto se necessario.
Le chiavi vengono ripulite prima del confronto?
No. Il confronto esatto conserva spazi, maiuscole e zeri iniziali; normalizzi prima i valori se le Sue regole lo richiedono.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"left_csv": "id,name\n1,Ada\n2,Linus\n3,Grace",
"right_csv": "id,team\n1,Research\n2,Platform\n4,Support",
"key": "id"
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.merge_csv_on_key",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_mb | 25 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |