Validare CSV con uno schema di colonne e trovare gli errori
Un file CSV può sembrare ordinato e contenere comunque valori che bloccano un’importazione, un report o una pipeline di dati.
Esegui gratis nel browser
Funziona nel tuo browser: gratis, senza registrazione, i file non escono dal tuo dispositivo.
Questo validatore confronta l’intestazione con le colonne esatte attese da Lei, quindi esamina ogni riga con regole esplicite per stringhe, numeri, interi, booleani e date ISO. Invece di fermarsi alla prima cella errata, restituisce l’elenco completo delle violazioni con numeri di riga e nomi di colonna. Può eseguirlo gratuitamente nel browser oppure usare l’API al costo di $0.002 per richiesta in un flusso automatizzato.
Definisca il contratto prima di controllare il file
Descriva ogni colonna attesa tramite tre proprietà: nome esatto, tipo e obbligatorietà. L’ordine è importante perché i dati CSV sono posizionali; un’intestazione nome,id non è intercambiabile in sicurezza con id,nome, anche se entrambe contengono gli stessi nomi. Il validatore confronta quindi l’intera intestazione con lo schema prima di esaminare le righe. Una colonna mancante, aggiuntiva, rinominata, duplicata o riordinata genera un errore di input anziché un report fuorviante. I tipi supportati sono string, number, integer, boolean e date. I numeri accettano la notazione decimale e scientifica; gli interi devono essere numeri interi sicuri; i booleani ammettono true o false senza distinzione tra maiuscole e minuscole; le date usano YYYY-MM-DD con controllo dei giorni di calendario. Una stringa accetta qualsiasi valore non vuoto, mentre required stabilisce separatamente se una cella vuota è consentita. Un intero facoltativo può quindi mancare, ma, se presente, deve comunque essere valido.
Interpreti correttamente le violazioni
Il risultato inizia con l’indicatore valid e con i conteggi di righe, colonne e violazioni. Quando valid è false, l’array violations identifica ogni problema mediante numero di riga, nome della colonna, codice stabile e messaggio leggibile. La numerazione segue il CSV: la riga 1 è l’intestazione e il primo record si trova alla riga 2. Lei può quindi aprire il file originale e raggiungere subito la posizione indicata. Una violazione required segnala che una cella obbligatoria è vuota. Una violazione type indica che un valore presente non soddisfa il tipo dichiarato. Le righe con un numero eccessivo o insufficiente di campi ricevono column_count nella colonna speciale _row, perché il problema strutturale non può essere assegnato con certezza a una singola cella. Il parser gestisce virgole tra virgolette, virgolette con escape, interruzioni di riga incorporate e file CRLF; la punteggiatura legittima in un campo racchiuso tra virgolette non sposta quindi le colonne successive.
Inserisca la convalida all’ingresso del flusso
Convalidi il file il più vicino possibile al punto in cui entra nel Suo sistema. Può rifiutare il caricamento di un partner prima che raggiunga il database, controllare un’esportazione pianificata prima dei calcoli successivi o presentare in un importatore tutte le celle correggibili. Poiché l’algoritmo è deterministico e non usa la rete, lo stesso CSV e lo stesso schema producono sempre il medesimo report. L’output è quindi adatto sia ai controlli automatici sia alla correzione interattiva. Tratti una mancata corrispondenza dell’intestazione diversamente dalle violazioni di riga: la prima indica che il file non rappresenta il set di dati atteso; le seconde riguardano record riconoscibili da correggere. Il validatore segnala soltanto i problemi e non modifica, converte, ritaglia o sostituisce mai i valori originali. Se la pipeline richiede normalizzazione, la esegua come passaggio distinto e consapevole, quindi convalidi nuovamente rispetto al contratto effettivamente richiesto dalla destinazione.
Casi d'uso
Controllo qualità delle importazioni
Rifiuti i CSV caricati da clienti o partner con riferimenti esatti a riga e colonna prima dell’importazione nel database.
Monitoraggio delle esportazioni
Controlli le esportazioni ricorrenti per rilevare modifiche alle intestazioni, celle obbligatorie vuote e valori non più conformi al tipo.
Correzione in blocco
Restituisca insieme tutte le violazioni rilevabili affinché un operatore possa correggere il file in una sola revisione.
Domande frequenti
L’intestazione CSV deve rispettare lo stesso ordine dello schema?
Sì. Nomi e ordine devono coincidere esattamente; in caso contrario, la richiesta fallisce con un errore di input relativo all’intestazione.
Quali tipi di colonna sono supportati?
Lo schema supporta string, number, integer, boolean e date. Le date devono rappresentare giorni reali nel formato YYYY-MM-DD.
La convalida si ferma alla prima riga errata?
No. Dopo l’accettazione dell’intestazione vengono controllate tutte le righe e tutte le violazioni rilevate sono restituite insieme.
Come vengono gestite virgole e interruzioni di riga tra virgolette?
I campi racchiusi tra virgolette possono contenere virgole, virgolette doppie con escape e interruzioni di riga senza creare colonne aggiuntive.
Lo strumento modifica o converte i valori CSV?
No. Segnala soltanto le violazioni; non ritaglia, converte, completa né riscrive mai il CSV inviato.
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/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)Esempio di richiesta
{
"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
}
]
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.csv_validate_schema",
"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. |