Validar CSV com esquema de colunas e localizar erros
Um arquivo CSV pode parecer organizado e ainda conter valores que interrompem uma importação, um relatório ou um pipeline de dados.
Executar grátis
Roda direto no seu navegador. Grátis, sem cadastro — seus dados não são enviados para lugar nenhum.
Este validador compara o cabeçalho com as colunas exatas esperadas por você e examina cada linha com regras explícitas para texto, números, inteiros, booleanos e datas ISO. Em vez de parar na primeira célula inválida, ele devolve uma lista completa de violações com números de linha e nomes de coluna. Você pode executá-lo gratuitamente no navegador ou usar a API por US$ 0,002 por solicitação em um fluxo automatizado.
Defina o contrato antes de verificar o arquivo
Descreva cada coluna esperada com três propriedades: nome exato, tipo e obrigatoriedade. A ordem importa porque CSV representa dados posicionais; um arquivo com cabeçalho nome,id não pode ser trocado com segurança por id,nome, mesmo que ambos tragam os mesmos nomes. Por isso, o validador compara o cabeçalho inteiro com o esquema antes de analisar as linhas. Uma coluna ausente, extra, renomeada, duplicada ou reordenada gera erro de entrada, e não um relatório enganoso. Os tipos aceitos são string, number, integer, boolean e date. Números admitem notação decimal e científica; inteiros devem ser números inteiros seguros; booleanos aceitam true ou false sem diferenciar maiúsculas; e datas usam YYYY-MM-DD com validação do calendário. Um texto aceita qualquer valor não vazio, enquanto required determina separadamente se a célula pode ficar vazia. Assim, um inteiro opcional pode ser omitido, mas, quando informado, ainda precisa ser um inteiro válido.
Interprete corretamente as violações
O resultado começa com o indicador valid e os totais de linhas, colunas e violações. Quando valid é false, o array violations identifica cada problema por número da linha, nome da coluna, código estável e mensagem legível. A numeração acompanha o próprio CSV: a linha 1 é o cabeçalho e o primeiro registro está na linha 2. Dessa forma, você pode abrir o arquivo original e ir diretamente ao ponto indicado. Uma violação required significa que uma célula obrigatória está vazia. Uma violação type significa que um valor presente não atende ao tipo declarado. Linhas com campos a mais ou a menos recebem column_count na coluna especial _row, pois o problema estrutural não pode ser atribuído com segurança a uma célula nomeada. O parser reconhece vírgulas entre aspas, aspas escapadas, quebras de linha internas e arquivos CRLF; portanto, pontuação legítima dentro de um campo citado não desloca colunas posteriores nem cria alertas falsos.
Valide na entrada do fluxo de trabalho
Faça a validação o mais perto possível do ponto em que o arquivo entra no seu sistema. Um upload de parceiro pode ser rejeitado antes de chegar ao banco de dados, uma exportação agendada pode ser conferida antes dos cálculos seguintes e um importador pode apresentar todas as células corrigíveis de uma só vez. Como o algoritmo é determinístico e não acessa a rede, o mesmo CSV e o mesmo esquema sempre produzem o mesmo relatório. Isso torna a saída útil tanto para bloqueios automáticos quanto para limpeza interativa. Trate uma divergência de cabeçalho de modo diferente das violações de linha: a primeira mostra que o arquivo não é o conjunto de dados esperado; as demais mostram registros reconhecíveis que precisam de correção. O validador apenas informa e nunca edita, converte, remove espaços ou substitui valores. Se o seu pipeline exigir normalização, execute-a como uma etapa deliberada separada e valide novamente conforme o contrato exigido pelo destino.
Casos de uso
Controle de qualidade da importação
Rejeite uploads CSV de clientes ou parceiros com referências exatas de linha e coluna antes da importação no banco de dados.
Monitoramento de exportações
Verifique exportações recorrentes para detectar mudanças no cabeçalho, campos obrigatórios vazios e valores fora do tipo declarado.
Correção em lote
Receba todas as violações detectáveis de uma vez para que uma pessoa corrija o arquivo em uma única revisão.
Perguntas frequentes
O cabeçalho CSV precisa seguir a mesma ordem do esquema?
Sim. Nomes e ordem devem coincidir exatamente; caso contrário, a solicitação falha com um erro de entrada no cabeçalho.
Quais tipos de coluna são aceitos?
O esquema aceita string, number, integer, boolean e date. Datas devem representar dias reais no formato YYYY-MM-DD.
A validação para após a primeira linha inválida?
Não. Depois que o cabeçalho passa, todas as linhas são verificadas e todas as violações encontradas são devolvidas juntas.
Como são tratadas vírgulas e quebras de linha entre aspas?
Campos entre aspas podem conter vírgulas, aspas duplas escapadas e quebras de linha sem criar colunas extras.
A ferramenta modifica ou converte valores CSV?
Não. Ela apenas relata violações; nunca remove espaços, converte, preenche ou reescreve o CSV enviado.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
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)Exemplo de requisição
{
"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
}
]
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.csv_validate_schema",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_mb | 25 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |