Valider un CSV avec un schéma de colonnes et repérer les erreurs
Un fichier CSV peut sembler ordonné tout en contenant des valeurs qui bloquent un import, un rapport ou un pipeline de données.
Lancer gratuitement
Tout se passe dans votre navigateur : gratuit, sans envoi de vos données.
Ce validateur compare l’en-tête aux colonnes exactes que vous attendez, puis contrôle chaque ligne selon des règles explicites pour les chaînes, nombres, entiers, booléens et dates ISO. Au lieu de s’arrêter à la première cellule erronée, il renvoie la liste complète des violations avec les numéros de ligne et les noms de colonne. Exécutez-le gratuitement dans le navigateur ou utilisez l’API pour $0.002 par requête dans un processus automatisé.
Définissez le contrat avant de contrôler le fichier
Décrivez chaque colonne attendue avec trois propriétés : son nom exact, son type et son caractère obligatoire. L’ordre compte, car les données CSV sont positionnelles ; un en-tête nom,id n’est pas interchangeable sans risque avec id,nom, même si les deux noms sont présents. Le validateur compare donc l’en-tête complet au schéma avant d’examiner les lignes. Toute colonne absente, supplémentaire, renommée, dupliquée ou déplacée provoque une erreur d’entrée plutôt qu’un rapport trompeur. Les types pris en charge sont string, number, integer, boolean et date. Les nombres acceptent les notations décimale et scientifique, les entiers doivent être des nombres entiers sûrs, les booléens acceptent true ou false sans tenir compte de la casse et les dates suivent YYYY-MM-DD avec contrôle du calendrier. Une chaîne accepte toute valeur non vide, tandis que required détermine séparément si une cellule vide est permise. Ainsi, un entier facultatif peut être vide, mais toute valeur présente doit rester un entier valide.
Interprétez précisément les violations
Le résultat commence par l’indicateur valid et par les totaux de lignes, de colonnes et de violations. Lorsque valid vaut false, le tableau violations décrit chaque problème avec un numéro de ligne, un nom de colonne, un code stable et un message lisible. La numérotation suit le CSV : la ligne 1 correspond à l’en-tête et le premier enregistrement se trouve à la ligne 2. Vous pouvez ainsi ouvrir le fichier source et accéder directement à l’emplacement signalé. Une violation required indique qu’une cellule obligatoire est vide. Une violation type indique qu’une valeur présente ne respecte pas le type déclaré. Les lignes qui comportent trop ou trop peu de champs reçoivent column_count sous la colonne spéciale _row, car le défaut structurel ne peut pas être rattaché sûrement à une cellule nommée. Le parseur gère les virgules entre guillemets, les guillemets échappés, les retours à la ligne intégrés et les fichiers CRLF ; la ponctuation légitime ne décale donc pas les colonnes suivantes.
Placez la validation à l’entrée du processus
Validez le fichier aussi près que possible de son point d’entrée dans votre système. Vous pouvez refuser le dépôt d’un partenaire avant son arrivée en base de données, vérifier un export planifié avant les calculs en aval ou présenter toutes les cellules à corriger dans un outil d’import. L’algorithme étant déterministe et sans accès réseau, le même CSV associé au même schéma produit toujours le même rapport. La sortie convient donc aux contrôles automatiques comme aux corrections interactives. Distinguez une discordance d’en-tête des violations de ligne : la première signifie que le fichier n’est pas le jeu de données attendu, tandis que les secondes concernent des enregistrements reconnaissables à corriger. Le validateur ne fait que signaler les écarts ; il ne modifie, ne convertit, ne raccourcit et ne remplace jamais les valeurs. Si votre pipeline exige une normalisation, effectuez-la dans une étape distincte, puis validez de nouveau selon le contrat réellement demandé par la destination.
Cas d’usage
Contrôle qualité avant import
Refusez les fichiers CSV de clients ou partenaires avec des références précises de ligne et de colonne avant leur import en base.
Surveillance des exports
Contrôlez les exports récurrents pour détecter les changements d’en-tête, les champs obligatoires vides et les types devenus invalides.
Correction groupée
Renvoyez toutes les violations détectables à la fois afin qu’une personne corrige le fichier en une seule passe.
Questions fréquentes
L’en-tête CSV doit-il suivre le même ordre que le schéma ?
Oui. Les noms et leur ordre doivent correspondre exactement, sinon la requête échoue avec une erreur d’entrée sur l’en-tête.
Quels types de colonnes sont acceptés ?
Le schéma accepte string, number, integer, boolean et date. Les dates doivent être des jours réels au format YYYY-MM-DD.
La validation s’arrête-t-elle à la première ligne incorrecte ?
Non. Une fois l’en-tête accepté, toutes les lignes sont contrôlées et toutes les violations détectées sont renvoyées ensemble.
Comment les virgules et retours à la ligne entre guillemets sont-ils traités ?
Les champs cités peuvent contenir des virgules, des guillemets doubles échappés et des retours à la ligne sans créer de colonnes supplémentaires.
Cet outil modifie-t-il ou convertit-il les valeurs CSV ?
Non. Il signale uniquement les violations et ne tronque, ne convertit, ne complète ni ne réécrit jamais le CSV fourni.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre 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)Exemple de requête
{
"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
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.csv_validate_schema",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_mb | 25 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |