Résumé

  • RFC 4180, octobre 2005, a décrit un format CSV courant et enregistré le type text/csv. Ce texte informatif reconnaissait les différences entre logiciels et prévoyait un paramètre facultatif pour signaler une ligne d’en-tête.
  • RFC 7111, janvier 2014, a ajouté des fragments pour viser une ligne, une colonne ou une cellule : #row=4, #col=2, #cell=4,1. Le comptage commence à un. Un client qui ne comprend pas ces fragments reçoit tout de même le fichier entier.
  • Le nombre désigne une place dans la version reçue, pas l’identité d’un enregistrement. Si une ligne est insérée avant la quatrième, le même lien sélectionne le nouvel occupant de cette place. Le serveur ne peut pas savoir de façon fiable quel fragment le lecteur avait utilisé.

Une précision que le fichier ne promettait pas

Une administration met en ligne un tableau CSV. Une chercheuse veut renvoyer ses lecteurs vers la décision située à la quatrième ligne. L’adresse du fichier entier oblige à ouvrir le tableau et à chercher. Une adresse terminée par #row=4 semble résoudre le problème en six caractères : le lecteur arrive exactement sur la ligne qui soutient la phrase.

Cette possibilité a été décrite dans RFC 7111, publié en janvier 2014. Le document spécifie des fragments d’URI pour les ressources servies en text/csv. row choisit des lignes, col des colonnes et cell une position dans la grille. Son exemple data.csv#row=4 vise la quatrième ligne du fichier. Dans l’exemple, la première ligne contient les noms des colonnes ; la ligne quatre est donc le troisième enregistrement de données. Une personne qui compterait seulement les observations ferait déjà un décalage d’une ligne.

La base était moins ordonnée que la syntaxe ne le suggère. RFC 4180, publié en octobre 2005, a enregistré le type MIME text/csv et décrit un format largement utilisé. Son auteur relevait que les fichiers séparés par des virgules circulaient depuis longtemps entre tableurs sans description unique reconnue. Le document détaille les virgules, les guillemets, les retours de ligne et la possibilité d’un en-tête ; il reconnaît aussi les différences entre programmes. Son statut est informatif, pas celui d’une norme Internet imposant un comportement uniforme à tous les producteurs de CSV.

Le paramètre header peut annoncer present ou absent. Quand il manque, le logiciel doit décider ce que représente la première ligne. La position physique, elle, se compte quand même à partir de un dans RFC 7111. Si un lecteur parle de « quatrième donnée » et que le fichier contient un en-tête, son objet se trouve à la cinquième ligne. Le lien peut avoir l’air précis avant même que le premier changement du fichier ne vienne le déplacer.

Une place ne constitue pas une identité

La grammaire de 2014 est plus riche qu’une épingle sur une seule ligne. #col=2 sélectionne la deuxième colonne. #cell=4,1 vise le premier champ de la quatrième ligne. Le tiret permet une plage, l’astérisque la dernière ligne ou colonne, et le point-virgule plusieurs sélections distinctes. On peut citer un morceau du tableau sans demander au producteur de créer une page Web pour chacun de ses champs.

L’adresse reste positionnelle. Elle ne contient ni clé d’enregistrement, ni empreinte de la valeur attendue, ni date de la version visée. Les instructions du fragment indiquent au logiciel du lecteur où regarder dans le fichier qu’il reçoit. Elles ne lui disent pas si l’élément à cet endroit est celui dont parlait l’auteur du lien lors de sa publication.

Prenons un tableau où la quatrième ligne porte une décision favorable. Un mois plus tard, le producteur ajoute une observation en haut pour rétablir l’ordre chronologique. L’ancienne ligne quatre devient la ligne cinq. Le fragment #row=4 n’est pas cassé : une quatrième ligne existe toujours, et un logiciel compatible peut la mettre en évidence. Mais elle peut contenir une décision différente. Le lien est valide, la preuve citée a quitté l’adresse.

Supprimer une ligne avant la cible produit le déplacement inverse. Réordonner le tableau en produit plusieurs d’un seul geste. Une colonne ajoutée avant un champ cité déplace également #cell=4,1 ou un autre sélecteur de cellule. Cette fragilité n’a rien de mystérieux : elle découle du comptage à partir de un que RFC 7111 définit. Une adresse de position dépend de l’ordre de la représentation reçue.

Il faudrait comparer une version datée du fichier à une version ultérieure pour établir qu’une citation réelle a changé d’objet. Les trois textes examinés ici établissent le mécanisme, sans recenser d’incident particulier. Cette limite ne rend pas le risque abstrait : elle indique exactement quelles pièces permettraient de vérifier le déplacement dans un cas concret.

Le serveur ne voit pas le doigt du lecteur

La répartition des rôles vient de plus loin. RFC 3986, publié en janvier 2005, présente le fragment d’une URI comme une référence indirecte traitée du côté du client. Avant la récupération de la ressource principale, le fragment est séparé. Son interprétation dépend du type de média reçu ; le logiciel de l’utilisateur résout ensuite la partie désignée. RFC 7111 applique ce principe général au CSV.

Le document de 2014 en tire une conséquence opérationnelle explicite : le serveur ne dispose d’aucun moyen fiable de savoir si le client demandant le CSV a utilisé un fragment. Il remet le fichier. Un client qui connaît row peut montrer la ligne quatre ; un autre, qui ne connaît pas la syntaxe, affiche ou télécharge le document complet. La requête adressée au serveur ne porte pas une preuve de la ligne choisie par chaque lecteur.

Cette séparation donne une liberté réelle à celui qui écrit le lien. On peut désigner une petite partie d’un fichier publié par autrui, sans attendre que son propriétaire crée une route pour chaque ligne. Elle donne aussi à la citation une dépendance au logiciel qui l’ouvre. Le journal du serveur prouve que le fichier a été demandé, pas que la quatrième ligne a été montrée, comprise ou vérifiée.

RFC 7111 prévoit même les références mal formées. Le client ignore une syntaxe erronée plutôt que de deviner. Une sélection individuelle au-delà de la taille du fichier est ignorée ; une plage trop longue est limitée à la taille réelle. Ces règles traitent les positions impossibles. Elles ne traitent pas une position parfaitement possible occupée par un autre fait. Une quatrième ligne correcte au regard de la grammaire peut être une mauvaise preuve.

Le chapitre consacré à la sécurité ajoute une alerte sur les différences d’affichage. Certains logiciels peuvent montrer un fragment choisi, d’autres l’ensemble du CSV ; cette différence peut induire le lecteur en erreur. Une même adresse peut donc apparaître comme une citation pointue dans un outil et comme un simple téléchargement dans un autre. Le document ne fournit pas de calendrier des navigateurs ayant adopté la fonction ; des traces d’implémentation datées seraient nécessaires pour l’établir.

Quand une source survit au fait qu’elle citait

Le CSV devait sa circulation à sa simplicité. Un fichier peu coûteux à produire passait d’un logiciel à l’autre ; text/csv lui donnait une identité de média sur Internet. Le fragment de 2014 ajoutait une manière de citer une portion de ce fichier sans bâtir un service de données. C’est un bon marché pour la diffusion, mais il laisse la conservation d’une preuve précise à celui qui publie et à celui qui cite.

Pour une indication provisoire, la quatrième ligne du fichier actuel peut suffire. Pour une affirmation qui doit rester vérifiable, mieux vaut conserver une version datée, publier une clé indépendante pour chaque enregistrement ou fournir un lien stable vers le fait lui-même. Ces choix coûtent plus de travail qu’un #row=4. Ils rendent également visible quel élément était visé après une mise à jour du tableau.

RFC 7111 est une soumission indépendante de catégorie informative. La modification de l’enregistrement du type text/csv a obtenu l’accord requis de l’IESG. Cela décrit une syntaxe et son traitement par un client compatible, pas le nombre de lecteurs qui la comprennent. Sa force est de rendre une ligne adressable ; son angle mort est que la ligne conserve son numéro même quand son contenu change.