Validar CSV con un esquema de columnas y detectar errores
Un archivo CSV puede parecer ordenado y aun así contener valores que interrumpan una importación, un informe o un flujo de datos.
Ejecutar — gratis
Corre en su navegador. Gratis y sin límite: sus datos no salen de esta página.
Este validador compara la cabecera con las columnas exactas que usted espera y revisa cada fila mediante reglas explícitas para texto, números, enteros, booleanos y fechas ISO. En lugar de detenerse ante la primera celda incorrecta, devuelve una lista completa de infracciones con números de fila y nombres de columna. Puede ejecutarlo gratis en el navegador o usar la API por $0.002 por solicitud dentro de un flujo automatizado.
Defina el contrato antes de revisar el archivo
Describa cada columna esperada mediante tres propiedades: su nombre exacto, su tipo y si es obligatoria. El orden importa porque CSV representa datos posicionales; una cabecera nombre,id no puede intercambiarse con id,nombre de forma segura, aunque contenga los mismos nombres. Por eso, el validador compara la cabecera completa con el esquema antes de examinar las filas. Una columna ausente, adicional, renombrada, duplicada o reordenada provoca un error de entrada, no un informe engañoso. Se admiten los tipos string, number, integer, boolean y date. Los números aceptan notación decimal y científica; los enteros deben ser números enteros seguros; los booleanos aceptan true o false sin distinguir mayúsculas; y las fechas usan YYYY-MM-DD con comprobación del calendario. Un texto admite cualquier valor no vacío, mientras que required determina por separado si se permite una celda vacía. Así, un entero opcional puede quedar vacío, pero, si aparece, debe seguir siendo entero.
Interprete correctamente las infracciones
El resultado comienza con el indicador valid y con recuentos de filas, columnas e infracciones. Cuando valid es false, el arreglo violations identifica cada problema mediante número de fila, nombre de columna, código estable y mensaje legible. La numeración sigue el propio CSV: la fila 1 es la cabecera y el primer registro ocupa la fila 2. Así, usted puede abrir el archivo original y acudir directamente al punto señalado. Una infracción required indica que una celda obligatoria está vacía. Una infracción type señala que un valor presente no satisface el tipo declarado. Las filas con más o menos campos reciben column_count bajo la columna especial _row, ya que el fallo estructural no puede atribuirse con fiabilidad a una sola celda. El analizador entiende comas entre comillas, comillas escapadas, saltos de línea internos y archivos CRLF; por tanto, la puntuación válida dentro de un campo citado no desplaza las columnas posteriores ni genera avisos falsos.
Sitúe la validación en el límite del flujo
Valide el archivo lo más cerca posible de su entrada al sistema. Puede rechazar la carga de un socio antes de que llegue a la base de datos, comprobar una exportación programada antes de ejecutar cálculos posteriores o mostrar todas las celdas corregibles desde un importador. Como el algoritmo es determinista y no utiliza la red, el mismo CSV y el mismo esquema siempre producen el mismo informe. Esto permite usar la salida tanto en controles automáticos como en tareas de limpieza asistida. Trate una cabecera incorrecta de manera distinta a las infracciones de filas: la primera indica que el archivo no corresponde al conjunto de datos esperado; las segundas indican que existen registros reconocibles que deben corregirse. El validador solo informa: nunca edita, convierte, recorta ni sustituye valores. Así evita alterar silenciosamente identificadores, ceros iniciales o texto escrito por personas. Si necesita normalización, realícela como un paso independiente y vuelva a validar después contra el contrato real del destino.
Qué puede hacer con ella
Control de calidad de importaciones
Rechace cargas CSV de clientes o socios con referencias exactas de fila y columna antes de importarlas en una base de datos.
Supervisión de exportaciones
Revise exportaciones periódicas para detectar cambios de cabecera, celdas obligatorias vacías y valores cuyo tipo ya no coincide.
Corrección masiva
Obtenga todas las infracciones detectables de una vez para que una persona pueda reparar el archivo en una sola revisión.
Preguntas frecuentes
¿La cabecera CSV debe seguir el mismo orden que el esquema?
Sí. Los nombres y el orden deben coincidir exactamente; de lo contrario, la solicitud falla con un error de entrada relativo a la cabecera.
¿Qué tipos de columna se admiten?
El esquema admite string, number, integer, boolean y date. Las fechas deben ser días reales del calendario en formato YYYY-MM-DD.
¿La validación se detiene tras la primera fila incorrecta?
No. Cuando la cabecera es válida, se revisan todas las filas y se devuelven juntas todas las infracciones detectadas.
¿Cómo se tratan las comas y los saltos de línea entre comillas?
Los campos citados pueden contener comas, comillas dobles escapadas y saltos de línea sin dividirse en columnas adicionales.
¿La herramienta modifica o convierte los valores CSV?
No. Solo informa de infracciones; nunca recorta, convierte, completa ni reescribe el CSV enviado.
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/csv-validate-schema \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"csv":"id,email,active\n1,ada@example.com,true\n2,grace@example.com,false","schema":[{"name":"id","type":"integer","required":true},{"name":"email","type":"string","required":true},{"name":"active","type":"boolean","required":true}]}'const res = await fetch("https://api.kit.forhosting.com/data/csv-validate-schema", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"csv": "id,email,active\n1,ada@example.com,true\n2,grace@example.com,false",
"schema": [
{
"name": "id",
"type": "integer",
"required": true
},
{
"name": "email",
"type": "string",
"required": true
},
{
"name": "active",
"type": "boolean",
"required": true
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/csv-validate-schema",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"csv": "id,email,active\n1,ada@example.com,true\n2,grace@example.com,false",
"schema": [
{
"name": "id",
"type": "integer",
"required": true
},
{
"name": "email",
"type": "string",
"required": true
},
{
"name": "active",
"type": "boolean",
"required": true
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/csv-validate-schema", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"csv":"id,email,active\\n1,ada@example.com,true\\n2,grace@example.com,false","schema":[{"name":"id","type":"integer","required":true},{"name":"email","type":"string","required":true},{"name":"active","type":"boolean","required":true}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"csv":"id,email,active\n1,ada@example.com,true\n2,grace@example.com,false","schema":[{"name":"id","type":"integer","required":true},{"name":"email","type":"string","required":true},{"name":"active","type":"boolean","required":true}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/csv-validate-schema", 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
{
"csv": "id,email,active\n1,ada@example.com,true\n2,grace@example.com,false",
"schema": [
{
"name": "id",
"type": "integer",
"required": true
},
{
"name": "email",
"type": "string",
"required": true
},
{
"name": "active",
"type": "boolean",
"required": true
}
]
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.csv_validate_schema",
"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. |