Combine dos CSV por clave y detecte filas sin coincidencia
Combine dos archivos CSV mediante una clave cuando una tabla contenga los registros principales y otra aporte campos relacionados.
Ejecutar — gratis
Pegue ambos textos CSV, indique el encabezado común y obtenga una unión izquierda predecible sin configurar una base de datos ni escribir un script temporal. La respuesta también separa los registros sin correspondencia de ambos lados para facilitar su revisión. Los valores entrecomillados, las claves repetidas, las colisiones de encabezados y los finales de línea habituales se procesan de forma determinista.
Prepare dos archivos CSV con una clave compartida fiable
Identifique primero la columna que representa el mismo elemento en ambos archivos, como customer_id, order_number, sku o email. El encabezado debe coincidir exactamente con el valor de clave que envíe, incluidas las mayúsculas y los espacios. Los demás encabezados pueden ser distintos. El CSV izquierdo es la tabla principal: todos sus registros permanecen en el resultado combinado, exista o no una coincidencia a la derecha. El CSV derecho aporta columnas adicionales cuando coincide su clave. Utilice un identificador estable siempre que sea posible. Los nombres y las descripciones suelen cambiar, contener espacios incoherentes o repetirse, mientras que un identificador del sistema resulta más seguro. El analizador admite campos entrecomillados, comillas dobles escapadas, comas dentro de valores entrecomillados, saltos de línea incrustados, archivos CRLF y una marca de orden de bytes UTF-8 inicial. Si ambos archivos usan otro separador, indique ese delimitador de un carácter. Las dos entradas deben emplear el mismo delimitador. Los nombres de columna vacíos o duplicados se rechazan porque volverían ambiguos los objetos resultantes. También se devuelve un error claro si falta el encabezado clave en cualquiera de los CSV.
Comprenda la unión izquierda y las claves duplicadas
Para cada registro del CSV izquierdo, la capacidad busca registros del CSV derecho que tengan exactamente el mismo texto de clave. Una coincidencia produce un registro combinado. Si no existe ninguna, se genera igualmente un registro unido: se conservan los campos izquierdos y los campos aportados por la derecha quedan como cadenas vacías. Cuando el archivo derecho contiene varios registros con la misma clave, el registro izquierdo se expande en una fila de salida por cada coincidencia. Este comportamiento de uno a varios sirve para relacionar un cliente con varias suscripciones o un producto con varias existencias, aunque puede aumentar el número de filas. Las claves duplicadas de la izquierda se procesan por separado y mantienen su orden original. Las filas y las coincidencias conservan el orden de origen, lo que garantiza resultados deterministas. La clave compartida aparece una sola vez. Si un encabezado derecho distinto de la clave ya existe a la izquierda, recibe el prefijo right_ para evitar sobrescrituras. Se añaden más prefijos cuando hacen falta para mantener todos los nombres únicos. El array columns muestra el orden y los nombres finales exactos antes de que usted procese joined_rows.
Use los informes de filas sin correspondencia para conciliar datos
El array unmatched_left contiene los registros izquierdos originales cuya clave no encontró equivalente a la derecha. Esas entradas siguen presentes en joined_rows porque se trata de una unión izquierda, pero la lista separada permite enviarlas a corrección, enriquecimiento o revisión. El array unmatched_right contiene registros derechos originales que ninguna fila izquierda utilizó. No aparecen en la tabla unida, aunque suelen revelar datos de referencia obsoletos, identificadores nuevos inesperados o un archivo del periodo equivocado. Los recuentos resumen los tamaños de ambas fuentes, el tamaño expandido del resultado y los totales sin correspondencia. Así, un flujo puede rechazar una importación cuando unmatched_left sea mayor que cero o alertar cuando unmatched_right supere un umbral. La comparación es exacta: no recorta espacios, no normaliza mayúsculas ni reinterpreta números. Por tanto, 001, 1 y 1 con un espacio final son valores distintos. Esta regla conservadora evita asociaciones accidentales. Normalice las claves antes de usar la capacidad si sus reglas permiten tratarlas como equivalentes. Por $0.002 por solicitud mediante la API, puede incorporarla tanto a importaciones repetibles como a investigaciones puntuales.
Qué puede hacer con ella
Enriquezca exportaciones de clientes
Añada planes, territorios o responsables desde un CSV de referencia sin perder ningún cliente de la exportación principal.
Concilie pedidos y pagos
Una transacciones por número de pedido y revise pedidos impagados o pagos asociados a pedidos desconocidos.
Audite la cobertura del catálogo
Combine la lista maestra de SKU con datos del proveedor y detecte productos sin detalles o filas del proveedor sin uso.
Preguntas frecuentes
¿Qué sucede si falta la columna clave?
La solicitud falla con un error de entrada que indica si la clave falta en el CSV izquierdo o en el derecho.
¿La operación conserva todas las filas izquierdas?
Sí. Siempre es una unión izquierda; una fila sin coincidencia incluye cadenas vacías en los campos aportados por la derecha.
¿Cómo se gestionan las claves duplicadas?
Cada registro izquierdo se combina con todos los registros derechos coincidentes, por lo que una clave repetida puede producir varias filas.
¿Qué ocurre si ambos archivos tienen una columna con el mismo nombre?
La columna izquierda conserva su nombre y la derecha recibe el prefijo right_, con prefijos adicionales si son necesarios.
¿Se limpian las claves antes de compararlas?
No. La comparación exacta conserva espacios, mayúsculas y ceros iniciales; normalice los valores previamente si lo necesita.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su 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)Ejemplo de solicitud
{
"left_csv": "id,name\n1,Ada\n2,Linus\n3,Grace",
"right_csv": "id,team\n1,Research\n2,Platform\n4,Support",
"key": "id"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.merge_csv_on_key",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_mb | 25 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |