11) Ecrire et parser un fichier simple

Le parsing peut être défini en informatique comme l’opération d’extraire une information structurée d’un flux de données. Un ensemble de caractères informatiques d’un côté, une information utilisable de l’autre, et au milieu analyse et extraction.

Précédent | 12/16 | Suivant

Garder une partie des informations produites par un logiciel est un problème intéressant en informatique. Pouvoir utiliser ces informations, soit pour restituer fidèlement le processus qui les a créé, soit pour les transformer en autre chose, est un autre problème intéressant.

Cet article s’attache à montrer un système simple d’écriture de données dans un fichier texte, et un autre système de lecture et utilisation de ces mêmes données.

1) écrire des données avec printWriter

Printwriter est une classe permettant de générer des fichiers texte simples. On trouvera sur la page de référence sur le site de Processing un exemple, que nous allons modifier légèrement pour le rendre plus riche en information.

PrintWriter output;

void setup() {
size(600,400);
frameRate(24); // on calibre une vitesse d'exécution
 // Create a new file in the sketch directory
 output = createWriter("positions.txt");
background(255);
}

void draw() {
 point(mouseX, mouseY);
 output.println(mouseX + " " + mouseY); // ici on a légèrement modifié
}

void keyPressed() {
 output.flush(); // Writes the remaining data to the file
 output.close(); // Finishes the file
 exit(); // Stops the program
}

Dans le setup(), j’ai ajouté un frameRate(24), calibrant la vitesse du script à la vitesse de 24 frames par seconde, une taille et un background à l’animation. Dans le draw(), j’ai juste modifié la ligne commençant par "output" pour écrire en plus de la coordonnée en X de la souris, celle en Y.
Ce code produit un fichier texte dès le lancement du script, et ne s’arrête que lorsque l’on appuie sur n’importe quelle touche du clavier. Entre les deux, les coordonnées de la souris sont écrite à la vitesse du script, soit 24 fois par seconde.

Ce script crée un fichier du nom de "positions.txt" dans le dossier du sketch, et écrit à chaque draw() une ligne (avec un retour à la ligne) contenant mouseX, un espace, et mouseY. Appuyer sur une touche termine le fichier. Cette opération est importante : un fichier ouvert mais pas fermé ne sera pas valide. Il ne pourra pas être ouvert plus tard.

En laissant tourner ce script pendant quelques dizaines de secondes et en oubliant pas de fermer, on obtient un fichier texte très léger, contenant des données numériques de ce type :

2 350
2 350
6 345
14 339
24 334
32 331
38 328
46 326
50 323
60 317

Deux chiffres séparés par un espace, les coordonnées de la souris durant l’exécution du script.

La richesse des arts numériques réside notamment dans la diversité des sources de données : souris, caméra, clavier, micro, flux du net, fichier de tableur, etc.

2) Lire le fichier texte avec loadStrings()

Nous allons maintenant créer un autre sketch, capable de lire notre fichier positions.txt et d’utiliser ses données.

On prendra bien soin de placer le fichier positions.txt dans le dossier du script !

String[] infos;
int compteur=0;

void setup(){
 size(600,400);
 frameRate(24);
 infos=loadStrings("positions.txt");
 println("le fichier contient " + infos.length + " lignes");
 background(255);
}

void draw(){
 String i[] = split(infos[compteur]," ");
 int posx=int(i[0]);
 int posy=int(i[1]);
 ellipse(posx,posy,20,20);
 compteur++;
 if(compteur > infos.length-1){
  saveFrame("resultat.jpg");
  noLoop();
 }
 
}

void keyPressed(){
 compteur=0;
 background(255);
 loop();
}

Le code charge le fichier "positions.txt" avec la fonction loadStrings() qui a la particularité de renvoyer un array de Strings, une liste de texte. LoadStrings() sépare le fichier texte sur base des retour à la ligne, ce qui est parfait pour nous : chaque ligne contient les coordonnées de la souris enregistrée en temps réel.
Problème : les deux coordonnées de la souris sont considérées par Processing comme du texte (String) et pas deux données numérique (int). Il faut donc :
- séparer les deux informations. C’est la fonction split qui s’en charge. Elle a besoin de savoir ce qui sépare les informations dans le texte. Dans notre cas, c’est un espace, donc on spécifie de couper la ligne en autant de morceaux que split trouve séparé par des espaces (voir la page sur split()) :

String i[] = split(infos[compteur]," ")

On doit ensuite transformer ces deux informations, car elle sont actuellement considérées par Processing comme du texte (String) et pas comme des chiffres (int). La fonction int() se charge de cette transformation.

Enfin, on utilise les données pour écrire un cercle. Lorsque toutes les lignes sont lues, le sketch se met en pause, et est relancé si on appuie sur une touche.

Nettoyer les données

Lors du lancement du script, j’ai mis un temps à placer le curseur convenablement pour écrire le mot "hello". J’ai perdu du temps, et la souris a brièvement traversé le bord de l’écran, laissant trois points perdus dans l’espace. Je peux nettoyer ces erreurs directement dans le fichier "positions.txt". Je l’ouvre et repère dans le début du fichier les points perdus, ainsi que le moment d’arrêt avant le début du dessin lui-même : la souris est en 0 0 au début du script, puis deux coordonnées sont écrites, plus la troisième coordonnée se répète un grand nombre de fois.

0 0
0 0
0 0
0 0
0 0
0 0
572 45
560 29
545 13
545 13
545 13
545 13
545 13

Je supprime manuellement ces données parasites et le dessin démarre directement au lancement du script, tout propre.

Modifier l’interprétation des données

La richesse de l’art numérique réside notamment dans la manière dont on peut réinterpréter des données. On peut maintenant jouer avec les données contenues dans le fichier :
- lire les données à l’envers, de la fin du fichier vers son début
- dessiner des lignes entre les point pour faire un dessin continu
- dessiner en déformant l’échelle et les proportions
- dessiner à l’envers dans l’espace de l’animation
- générer un son ou une couleur ou une vitesse de lecture d’une vidéo
- dessiner un parcours sur un plan géographique
- ...
- 

JPEG - 23 ko
JPEG - 59.9 ko
JPEG - 19.4 ko
JPEG - 13.3 ko