Règles CSV RFC 4180
La RFC 4180 définit le CSV avec précision : des enregistrements séparés par CRLF, des champs séparés par des virgules, et des guillemets doubles autour de tout champ contenant une virgule, un guillemet ou un saut de ligne — les guillemets internes étant doublés sous la forme "". La ligne d’en-tête est optionnelle, le délimiteur est la virgule, et le type MIME est text/csv. La plupart des fichiers réels la suivent de loin.
Règles CSV RFC 4180 en clair
Le CSV est plus ancien que sa spécification. On échangeait des fichiers de valeurs séparées par des virgules depuis des décennies lorsque la RFC 4180 a été publiée en octobre 2005 comme document d’information — non pas une nouvelle conception, mais une description minutieuse de ce que le monde faisait déjà, mise par écrit pour que les parseurs puissent se mettre d’accord. Cette origine explique à la fois sa brièveté et la critique qui lui est le plus souvent adressée : la norme décrit la convention, et la convention précède la norme.
Les règles elles-mêmes sont courtes. Un fichier est une suite d’enregistrements ; les enregistrements sont séparés par CRLF ; les champs sont séparés par des virgules ; et un champ contenant une virgule, un guillemet double ou un saut de ligne doit être encadré de guillemets doubles, les guillemets internes étant écrits en doublon. Tout le reste — encodages, en-têtes, lignes irrégulières —, la RFC le rend optionnel ou le laisse à la pratique, d’où la dérive des fichiers réels.
Ce guide parcourt la grammaire règle par règle avec des exemples copiables, signale les endroits où la spécification dit « peut », et répertorie les divergences que vous rencontrerez réellement : marques d’ordre des octets, délimiteurs point-virgule, fins de ligne Unix. Les convertisseurs reliés tout au long du texte mettent en œuvre la grammaire complète — champs entre guillemets, sauts de ligne embarqués et tout le reste — entièrement dans votre navigateur.
Une grammaire se voit le mieux depuis la sortie d’un parseur : collez un fichier riche en guillemets dans le convertisseur CSV vers JSON et chaque règle ci-dessus devient un champ dans le JSON qu’il construit — analyse en local, aucun fichier envoyé.
Côté production, le convertisseur JSON vers CSV place des guillemets exactement là où la RFC 4180 l’exige, si bien que les allers-retours via les tableurs survivent aux virgules et aux sauts de ligne de vos données.
La grammaire : enregistrements, champs, CRLF
La grammaire de la RFC 4180 tient en un paragraphe. Un fichier se compose d’enregistrements, chaque enregistrement étant une suite de champs séparés par des virgules ; les enregistrements sont séparés par CRLF — les deux octets 0x0D 0x0A, et non le LF seul de l’outillage Unix — et le dernier enregistrement peut se terminer ou non par un CRLF final. Les champs peuvent être entre guillemets ou non : le recours aux guillemets est conditionnel, pas une affaire de style. L’esquisse ABNF est file = [header CRLF] record *(CRLF record); record = field *(comma field) — notez l’en-tête optionnel entre les crochets.
Un fichier conforme minimal
id,name,score 1,Ada,99 2,Grace,98
Le même fichier sous forme d'enregistrements
enregistrement 1 : id=1, name=Ada, score=99 enregistrement 2 : id=2, name=Grace, score=98 (chaque enregistrement se termine par les deux octets CRLF ; le dernier peut légalement les omettre)
Guillemets : le doublement du guillemet, seul système d’échappement
Un champ est encadré de guillemets doubles quand c’est nécessaire, et la seule façon d’insérer un guillemet double dans un champ entre guillemets est de le doubler — "" à l’intérieur d’un champ entre guillemets désigne un seul guillemet littéral. C’est là tout le mécanisme d’échappement : pas de barre oblique inverse, pas d’entités nommées, pas de second caractère de guillemets. Les apostrophes sont des données ordinaires, et un espace superflu après une virgule fait partie du champ suivant — la spécification est explicite : les espaces sont préservées et ne doivent pas être rognées.
| La valeur souhaitée | Le champ RFC 4180 | Pourquoi |
|---|---|---|
| plain | plain | Guillemets optionnels — la forme nue est la valeur par défaut |
| with, comma | "with, comma" | Les champs contenant des virgules doivent être entre guillemets |
| with " quote | "with "" quote" | Les guillemets internes sont doublés à l’intérieur des guillemets |
| with newline | "with newline" | Les champs entre guillemets peuvent contenir des sauts de ligne |
| padded | padded | Les espaces sont des données — guillemets optionnels, rognage interdit |
Un enregistrement, toutes les règles de guillemets à la fois
year,quote,note 1962,"she said ""look, no hands""","multi-word, no problem"
Champs après analyse
year → 1962 quote → she said "look, no hands" note → multi-word, no problem
Sauts de ligne et virgules à l’intérieur des champs
Comme les champs entre guillemets peuvent contenir des sauts de ligne, une ligne CSV n’est pas un enregistrement : un découpage naïf sur \n corrompt tout fichier comportant des champs multi-lignes — voilà pourquoi les blocs d’adresse, les colonnes de notes et les payloads JSON dans le CSV font échouer les importateurs naïfs. Un parseur conforme est une petite machine à états : entre guillemets, les virgules et les sauts de ligne sont des données ; à l’extérieur, ce sont des séparateurs. Il est impossible de l’écrire correctement avec split() seul.
La même machine à états tranche les cas limites du guillemet double : un guillemet ouvrant au milieu d’une valeur, un guillemet non refermé en fin de fichier, des guillemets doublés tout à la fin d’un champ. Ce sont exactement les cas que les quelques règles de la RFC 4180 ont été écrites pour trancher, et exactement là où les parseurs faits main se contredisent — d’où la plupart des signalements du type « ça marche dans Excel, ça casse dans l’importateur ».
Deux enregistrements, trois lignes physiques
name,address "Ada","12 St James Square, London" "Grace","1 Loop Rd"
Ce que produit un parseur conforme
enregistrement 1 : Ada | 12 St James Square, London enregistrement 2 : Grace | 1 Loop Rd (la virgule dans l’adresse est une donnée ; le CRLF entre guillemets aussi)
CRLF, l’en-tête optionnel et text/csv
Trois détails sont fixés par la spécification, et l’on suppose pourtant systématiquement le contraire. Les enregistrements se terminent par CRLF — même si le dernier enregistrement peut s’en passer, et même si chaque parseur que vous utilisez au quotidien accepte un LF seul. Le premier enregistrement peut contenir des noms de colonnes, mais la grammaire le considère comme optionnel : un en-tête est une convention que le format prend en charge, pas une structure qu’il exige — voilà pourquoi il faut dire à l’outillage — ou le laisser deviner — si la première ligne est une donnée. Et le type MIME enregistré est text/csv — enregistré par la RFC 4180 elle-même —, les paramètres de charset étant laissés à l’expéditeur.
Autre frontière que la RFC trace fermement : le délimiteur est la virgule. Les fichiers séparés par des points-virgule relèvent d’une convention de paramètres régionaux des tableurs — courante partout où la virgule décimale est la norme —, ce n’est pas une variante que la norme reconnaît. Un générateur conforme ne devine jamais, et un parseur conforme sonde le délimiteur ou se le fait préciser ; mais le fichier lui-même ne porte aucun marqueur de la convention qu’il suit.
Là où les fichiers réels dérivent de la norme
Le CSV réel précède la RFC, si bien que la divergence est la norme plutôt que l’exception. Cinq dérives expliquent presque tous les incidents du type « ce CSV ne veut pas s’analyser » :
Les bons outils exposent ces écarts au lieu de deviner en silence. Quand un fichier compte — factures, imports financiers, tout ce qu’un régulateur peut lire —, confrontez-le à la grammaire ci-dessus et corrigez la dérive à la source, plutôt que d’enseigner la même exception à chaque parseur en aval.
| Dérive | Source typique | Ce qui casse |
|---|---|---|
| BOM UTF-8 avant l’en-tête | Exports « CSV UTF-8 » des tableurs | Le nom de la première colonne gagne trois octets invisibles |
| Fins de ligne LF uniquement ou mixtes | Outillage Unix ; fichiers édités à la main | Les découpeurs stricts sur CRLF lisent mal les frontières d’enregistrement |
| Délimiteur point-virgule ou tabulation | Paramètres régionaux de tableurs non anglais | Les parseurs limités à la virgule fusionnent des colonnes |
| Guillemets incohérents | Exports partiels ; retouches manuelles | Les parseurs qui supposent des guillemets uniformes lisent mal les valeurs |
| Lignes irrégulières | Retouches manuelles ; jointures négligentes | Hypothèses sur le nombre de champs ; dérive des colonnes en aval |
Écrire un CSV qui survit aux allers-retours
La liste de contrôle du producteur fiable découle directement de la grammaire : mettez des guillemets uniformément — tous les champs, ou exactement ceux que les règles exigent ; les deux sont conformes, mais l’uniformité se relit plus sûrement — émettez CRLF, écrivez la ligne d’en-tête et encodez en UTF-8, en acceptant qu’un BOM soit parfois le prix de la reconnaissance par un tableur. Faites faire un aller-retour à tout ce qui compte : analysez le fichier que vous venez d’écrire, confirmez que chaque champ correspond aux données sources, puis expédiez-le. Le mode de défaillance récurrent est toujours le même — une valeur contenant le délimiteur que le générateur n’a jamais mise entre guillemets.
Questions fréquentes
Mon CSV est-il envoyé quand j’utilise les convertisseurs liés ici ?
Non — les outils CSV vers JSON et JSON vers CSV de ce site analysent et produisent entièrement dans votre navigateur : il n’y a aucune étape d’envoi, aucune copie côté serveur, et le panneau Network reste vide pendant qu’ils s’exécutent. La Content-Security-Policy du site bloque aussi les connexions sortantes, si bien que des données clients collées depuis un tableur ne peuvent pas quitter l’onglet.
La ligne d’en-tête est-elle obligatoire dans un fichier CSV ?
Pas pour la norme : la grammaire de la RFC 4180 rend le premier enregistrement optionnel, exactement comme n’importe quel autre — un en-tête est une convention qu’elle autorise, pas une structure qu’elle impose. En pratique, les consommateurs divergent : les importateurs de bases de données vous demandent souvent de déclarer si la première ligne est une donnée ou des noms, tandis que les outils tableurs supposent simplement qu’un en-tête existe.
Pourquoi mon fichier CSV utilise-t-il des points-virgule au lieu de virgules ?
C’est une convention de paramètres régionaux des tableurs, pas une autre norme : les locales qui utilisent la virgule comme séparateur décimal ont adopté le point-virgule pour que des nombres comme 3,14 n’entrent pas en collision avec les séparateurs de champs. La RFC 4180 fixe le délimiteur à la virgule, alors les outils doivent sonder le fichier, proposer une option de configuration — ou mal l’analyser, d’où un export qui s’ouvre très bien en local et casse en aval.
Comment placer un caractère guillemet dans un champ CSV ?
Doublez-le, dans un champ entre guillemets : la valeur say "hi" devient "say ""hi""" dans le fichier — le guillemet intérieur se double en une paire, et là où la paire doublée rencontre le guillemet fermant, vous en obtenez trois d’affilée. Le doublement est l’unique mécanisme d’échappement du format — pas de barre oblique inverse, pas d’entités. Un champ sans guillemets ne peut légalement contenir aucun guillemet, et les parseurs divergent sur la tolérance à accorder ; la forme portable met donc toujours le champ entre guillemets et double ses guillemets intérieurs.
Pourquoi un enregistrement CSV s’étend-il parfois sur plusieurs lignes ?
Comme les champs entre guillemets peuvent contenir des sauts de ligne, enregistrements et lignes physiques sont deux choses différentes. Une adresse sur trois lignes dans un seul champ fait s’étendre un enregistrement unique sur trois lignes, et tout découpeur qui traite \n comme une frontière d’enregistrement corrompt le fichier à partir de là. Les parseurs conformes suivent s’ils se trouvent entre guillemets — une petite machine à états, pas split().
Quelles fins de ligne le CSV exige-t-il réellement ?
La RFC 4180 spécifie CRLF entre les enregistrements — les deux octets, 0x0D 0x0A —, le dernier enregistrement étant autorisé à s’en passer. Le monde réel est plus souple : les outils Unix émettent un LF seul, des fins de ligne mixtes apparaissent dans les fichiers édités à la main, et la plupart des parseurs acceptent les trois. Les générateurs qui doivent interopérer avec des tableurs devraient émettre CRLF ; les lecteurs devraient tolérer le reste.
Où puis-je lire les normes citées ici ?
- RFC 4180 — Format commun et type MIME des fichiers CSV (valeurs séparées par des virgules)
Quels outils liés devriez-vous utiliser ensuite ?
- Convertir CSV en JSONLit un export de feuille de calcul, guillemets comprisOuvrir
- Convertir JSON en CSVTransforme des enregistrements en feuille de calcul, imbrications comprisesOuvrir
- Qu’est-ce que le JSONGuide en langage clairOuvrir
- Aide-mémoire de syntaxe JSONGuide en langage clairOuvrir
- Outils JSONComparez, formatez, validez et explorez des documents JSON.Ouvrir
- Valider du JSONVérifie la syntaxe avec ligne et colonne exactes, puis répareOuvrir