Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Ève

RFC 7111: URI Fragment Identifiers for the text/csv Media Type

Date de publication du RFC : Janvier 2014
Auteur(s) du RFC : M. Hausenblas (DERI, NUI Galway), E. Wilde (EMC Corporation), J. Tennison (Open Data Institute)
Pour information
Première rédaction de cet article le 17 janvier 2014


Le classique format CSV est normalisé dans le RFC 4180. Lorsqu'un URI désigne un fichier CSV, comment indiquer une partie spécifique du fichier ? Jusqu'à présent, il n'y avait pas de mécanisme pour cela. Ce nouveau RFC comble ce manque et définit une syntaxe (fragment identifier) pour désigner une ligne particulière, une colonne spécifique, voir une seule cellule d'un fichier CSV. http://www.example.org/data.csv#row=12 fonctionnera désormais, pour indiquer qu'on veut sauter à la douzième ligne du fichier data.csv.

Les ressources au format CSV sont identifiées par le type text/csv. Ce type a deux paramètres, charset qui indique l'encodage et header qui indique si l'en-tête facultatif de CSV est présent ou pas (cet en-tête donne le nom des colonnes). Rappelons que la syntaxe et la sémantique des identificateurs de fragment dans un URI dépendent du type de la ressource. Par exemple, « la cellule en 2ème ligne et 5ème colonne » a un sens en CSV mais pas en texte brut, alors que « le 292ème caractère » a un sens en texte brut (RFC 5147 pour les identificateurs de fragments du texte brut).

Attention, les identificateurs de fragments sont interprétés uniquement par le client Web. Leur bon fonctionnement dépend donc du déploiement du logiciel nécessaire chez les clients, ce qui va prendre du temps (je me demande combien de navigateurs Web gèrent le RFC 5147...). Le serveur n'a même pas un moyen de savoir si le client gère ces identificateurs de fragment. Mais ce n'est pas forcément un problème grave : si le client ne comprend pas la syntaxe des identificateurs de fragments pour CSV, il charge quand même le fichier CSV, il ne peut juste pas aller directement à la partie intéressante. Le repli se fait donc en douceur. Pour l'instant, à ma connaissance, il n'existe pas de logiciel qui gère ces fragments CSV.

Bref, voyons maintenant la sémantique des identificateurs de fragments pour CSV (section 2 du RFC). Le RFC contient un exemple avec des données de température mais je vais plutôt prendre les données BGP de la récente panne de l'Internet à Saint-Pierre-et-Miquelon. Les données originales étaient au format MRT (RFC 6396) mais bgpdump peut les traduire en quasi-CSV, il suffit d'un petit coup de sed ensuite :

% bgpdump -m updates.20140104.1930.bz2 | sed 's/|/,/g' > updates.20140104.1930.csv

Le fichier utilisé pour les exemples est panne-spm.csv (oui, il contient une ligne optionnelle d'en-tête au début, mais ne l'indique pas dans le type MIME, violant ainsi la section 3 du RFC 4180). Chaque ligne comprend notamment l'heure (deuxième colonne, vous pouvez traduire 1388864007 avec date -u --date=@1388864007), le type de message (troisième colonne, avec A = Announce et W = Withdraw), le pair qui a envoyé le message (quatrième colonne), le préfixe d'adresse IP concerné (sixième colonne), etc.

D'abord, on peut sélectionner une ligne particulière, la première étant numérotée 1 (pas zéro, attention, les informaticiens). La ligne d'en-tête, facultative, compte pour une ligne normale si elle est présente. Ainsi, la ligne 5 est BGP4MP,1388864007,W,195.66.224.32,3257,70.36.8.0/22. On peut aussi indiquer un intervalle des lignes. Ainsi, 5-7 est :

BGP4MP,1388864007,W,195.66.224.32,3257,70.36.8.0/22
BGP4MP,1388864007,A,195.66.225.76,251,70.36.8.0/22,251 3257 11260 3695,IGP,195.66.225.76,0,0,3257:4000 3257:8093 3257:50002 3257:50122 3257:51400 3257:51401 65020:10708,NAG,,
BGP4MP,1388864007,W,195.66.236.32,3257,70.36.8.0/22

Le signe * indique « la dernière ligne » donc * désigne :

BGP4MP,1388864142,W,195.66.224.215,31500,70.36.12.0/22

On peut aussi désigner une colonne donnée. Là aussi, on part de 1. La sixième colonne sera :

70.36.8.0/22
70.36.8.0/22
70.36.8.0/22
70.36.8.0/22
70.36.8.0/22
70.36.8.0/22
70.36.8.0/22
70.36.8.0/22
70.36.8.0/22
70.36.8.0/22
...

(Les Unixiens noteront que c'est l'équivalent de cut : cut -d, -f6 panne-spm.csv.) Et les colonnes 2-4 :

1388864007,A,195.66.224.32
1388864007,A,195.66.225.111
1388864007,A,195.66.236.32
1388864007,W,195.66.224.32
1388864007,A,195.66.225.76
1388864007,W,195.66.236.32
1388864007,A,195.66.224.32
...

Le signe * est également utilisable.

Enfin, on peut indiquer une cellule particulière, identifiée par une ligne et une colonne. 4,2 désignera donc 195.66.224.32. La syntaxe des intervalles marche aussi, donc 2-3,4-5 désignera quatre cellules :

1388864007,A
1388864007,W

Les identificateurs de fragments de ressources CSV peuvent aussi être composés de plusieurs sélections disjointes, mais, bon, cela devient un peu compliqué.

La syntaxe précise figure en section 3. Pour indiquer si le numéro désigne une ligne, une colonne, ou une cellule, on le préfixe avec row= (« rangée »), col= ou cell=. Comme montré dans l'exemple ci-dessus, les valeurs d'un intervalle sont séparées par un -, les lignes et colonnes d'une cellule par une ,. Si on a plusieurs sélections disjointes, elles sont séparées par un ;. Et, comme toujours avec les URI, l'identificateur de fragment est séparé du reste de l'URI par un #. Ainsi, l'URL pour récupérer la cellule 3,5 de mon fichier d'exemple sera http://www.bortzmeyer.org/files/panne-spm.csv#cell=3,5. Et, si vous avez un navigateur Web qui gère ce RFC, http://www.bortzmeyer.org/files/panne-spm.csv#row=10 devrait vous pointer directement sur la dixième ligne.

La section 4 donne des détails sur la manière exacte dont un client devrait gérer ces fragments, notamment en cas d'erreurs. S'il y a une erreur de syntaxe (par exemple http://www.bortzmeyer.org/files/panne-spm.csv#line=10, avec line au lieu de row), l'identificateur doit être ignoré (tout se passera donc comme si on était simplement allé en http://www.bortzmeyer.org/files/panne-spm.csv). Même chose si les nombres pointent en dehors du fichier, parce que trop grands.

L'enregistrement du type text/csv a été mis à jour pour inclure cette possibilité supplémentaire.


Téléchargez le RFC 7111

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)