Cours Apl 12 :
La gestion des fichiers + quelques autres notions nouvelles |
|
Dyalog Apl vous permet de manipuler 2 principaux types de fichiers : - les fichiers dits natifs ou textes - les fichiers Apl ou fichiers à composantes
Quel que soit le type de fichier, les étapes principales sont toujours les mêmes : - si le fichier existe, on s'y lie en indiquant son chemin et on crée par la même occasion un numéro de lien, utilisé pendant toute la durée de la manœuvre. - si on crée un nouveau fichier, on indique le chemin et le fichier est créé, la fonction de création rendant un numéro de lien. - Au moyen du numéro de lien, on peut lire et écrire dans le fichier ouvert - Quand on a fini, on le libère.
Les fichiers texte Toutes les fonctions de manipulation de fichiers textes commencent par ŒN, le N signifiant "Native" : natif en anglais. - Création de fichier natif: r„g ŒNCreate d g : chemin et nom du nouveau fichier d : numéro de lien à utiliser. Il est plus simple de laisser Apl choisir un numéro lui-même, dans ce cas, on met zéro comme numéro de lien r : numéro de lien. Égal à d si on a mis autre chose que zéro.
Exemple : créez le fichier zouzou.txt dans le même répertoire que votre ws de TD. - Cherchons d'abord le chemin de notre workspace. La fonction ŒWSid rend une chaîne contenant le chemin et le nom du ws. Pour récupérer uniquement le chemin, nous appliquons l'algorithme suivant : - on découpe le chemin/nom du ws en
vecteur de vecteurs dont chacun commence par un \ Nous allons utiliser pour cela le › en mode "split". Il admet en argument gauche un vecteur booléen pilotant le découpage. Il est de même dimension que le vecteur à découper. Essayez ceci : DISPLAY 1 0 0 1 0 1›'abcdef'
|…---------------- Pour découper, notre but est d'avoir un 1 à chaque fois qu'un \ est rencontré : (1,1‡ŒWSID='\') On remplace systématiquement le premier booléen par un 1 afin que la partie de chaîne à gauche du premier ‘\’ soit bien conservée. Pour connaître le chemin nous écrirons donc : Rep„(œ,/¯1‡(1,1‡ŒWSid='\')›ŒWSid),'\' - on découpe le chemin/nom du ws en vecteur de vecteurs dont chacun commence par un \ : (1,1‡ŒWSid='\')›ŒWSid - on abandonne le dernier (\nom du ws) : ¯1‡ - on concatène les éléments restants (réduction par concaténation) : ,/ - on extrait le vecteur de sa profondeur : œ - on ajoute \ à la fin de cette chaîne ,'\'
Reprenons la création du fichier zouzou.txt Numf„(Rep,'zouzou.txt')ŒNcreate 0 Numf est le numéro de lien pour ce fichier.
- Pour connaître les numéros des fichiers ouverts : ŒNnums
- Pour connaître les noms des fichiers ouverts : ŒNnames
- Pour connaître les deux : ŒNnums, ŒNnames
- Ecriture dans un fichier natif : - à la
suite du contenu déjà existant :
- à la place du contenu déjà existant : vecteur_de_données ŒNreplace num_lien, emplacement du début d'écriture (numéro d'octet).
Pour marquer les fins de lignes (nouvelle ligne, retour chariot) il faut y concaténer les 2 caractères CR et LF. On peut les obtenir de 2 manières : - ŒTC[3 2] - ŒAV[4 3] ŒAV contient les 256 caractères utilisés par Apl.
Donc pour ajouter "une première ligne" à zouzou.txt, on procèdera ainsi : ('Une première ligne.', ŒAV[4 3]) ŒNappend Numf
Encore une ligne ? ('Encore une ligne.', ŒAV[4 3]) ŒNappend Numf
- Refermer un fichier natif : ŒNuntie Num_fichier
- Ouvrir un fichier déjà existant : Les arguments sont les mêmes que pour la création de fichier : NumLien „ chemin_et_nom_fichier ŒNtie numéro_lien_à_utiliser_ou_0
- Lecture dans un fichier natif : Vecteur „ ŒNread Num_fichier, code conversion (en général 82), nombre de caractères à lire, position début de lecture Le dernier argument est facultatif. Concernant le nombre de caractères à lire, on indique généralement un très grand nombre afin d'être sûr de tout récupérer d'un coup.
Pour relire notre fichier : zouzou „ ŒNread Numf, 82, 100000 ½ de zouzou = 40
Si nous voulons le transformer en un vecteur de vecteurs dont chaque élément serait une ligne du fichier, nous devons découper le vecteur en fonction des fins de lignes (ŒAV[4 3]) et enlever ces séparateurs. 2‡¨(1 0,ŒAV[4 3]ºzouzou)›' ',zouzou
- Petite astuce pour refermer tous les fichiers natifs : ŒNuntie ŒNnums
- Autres fonctions : - renommer un fichier : ŒNrename - effacer un fichier : ŒNerase - taille d'un fichier : ŒNsize
Les fichiers Apl ou fichiers à composantes On peut se représenter ces fichiers comme des vecteurs généralisés dont chaque élément peut être le contenu d'une variable de type et de structure quelconque.
- Création de fichier à composantes : NumLien „ chemin_et_nom_fichier ŒFCREATE numéro_lien_à_utiliser_ou_0 Exemple : créez le fichier zouzou2 dans le même répertoire que votre ws de TD. Rep„(œ,/¯1‡(1,1‡ŒWSid='\')›ŒWSid),'\' Numf„(Rep,'zouzou2')ŒFCREATE 0
- Pour connaître les numéros des fichiers ouverts : Œfnums
- Pour connaître les noms des fichiers ouverts : Œfnames
- Pour connaître les deux : Œfnums, Œfnames
- Ecriture dans un fichier à composante : - à la suite du contenu déjà existant : objet_apl Œfappend num_lien - à la place du contenu déjà existant : objet_apl Œfreplace num_lien, num_composante
Exemple : Nous allons écrire dans les 3 premières composantes de zouzou2 le contenu des matrices Mnum1, Mnum2 et Mnum3. Mnum1 Mnum2 Mnum3 Œfappend¨Numf
On utilise le each pour éviter d'appeler 3 fois fappend.
Si on veut remplacer la troisième composante par le contenu de la variable Vnum1 : Vnum1 Œfreplace Numf 3
- Refermer un fichier à composantes : Œfuntie Num_fichier
- Ouvrir un fichier déjà existant : Les arguments sont les mêmes que pour la création de fichier : NumLien „ chemin_et_nom_fichier ŒFTIE numéro_lien_à_utiliser_ou_0 Par contre, on peut ouvrir le fichier en mode exclusif (ŒFTIE) ou partagé (Œfstie).
- Lecture dans un fichier à composantes : La lecture de ce type de fichier est très simple puisqu'on récupère directement un objet Apl. Variable „ Œfread Num_fichier, num_composante
- Autres fonctions : - renommer un fichier : Œfrename - effacer un fichier : Œferase - taille d'un fichier : Œfsize
Remarques sur les fichiers à composantes : Souvent la première composante fait office de sommaire, représentant de manière synthétique les composantes suivantes. Par exemple, on pourrait dans une école avoir un fichier des classes avec en première composante un vecteur de la liste des classes du type : "CP A", "CP B", "CE1 A", "CE1 B", etc ...
Ainsi on peut immédiatement afficher la liste des classes. Par ailleurs, l'utilisation du iota dyadique permet instantanément de retrouver la position de la classe recherchée. Le iota dyadique donne la position des éléments de son argument droit au sein de son argument gauche. Exemple : 1 3 'Louis' 2 'Yves' ¼ 3 4 'Louis' 2 6 3 3 a été trouvé en 2ème position, 4 n'a pas été trouvé et Louis a été trouvé en 3ème position. Si un des éléments de droite n'est pas trouvé à gauche, Apl donne sa position comme étant égale à la longueur de G + 1. Ainsi pour récupérer la composante du CE1 A, on écrirait : Classe „ Œfread Numfic, ((Œfread Numfic 1) ¼ › 'CE1 A') + 1
Les fichiers Apl sont également souvent organisés en fichiers dits "inversés". En effet, on a souvent tendance à créer une composante par enregistrement, ce qui semble la tendance la plus naturelle. En revanche, si on a beaucoup d'enregistrements et qu'on veut en sélectionner en fonction de certains critères, il faut alors tous les ouvrir pour voir si ils correspondent aux conditions. Dans le cas d'un fichier inversé, chaque composante contient un champ de tous les enregistrements. Par exemple dans le cas de notre TD, le fichier du personnel aurait 4 composantes : - nom Travaux pratiques :
0. Chargez votre Ws de travaux pratiques : )load c:\Mes documents\pratique-apl La société MyStyle Ltd s'est pas mal développée et elle a finalement créé 2 filiales : MyBaby, spécialisée dans les vêtements pour enfants et MyHome, spécialisée en design et mobilier d'intérieur. Votre logiciel de gestion du personnel doit donc désormais être multi-sociétés.
1. Créez un fichier à composantes intitulé PersoGroup, dans le même répertoire que votre ws. La première composante servira de sommaire. Ce sera un vecteur de vecteur comportant les noms des sociétés gérées. Les composantes suivantes contiendront les matrices de personnels correspondantes. Dans un premier temps, mettez simplement "MyStyle Ltd" et "MyBaby" dans la première composante, le contenu de la variable Perso dans la deuxième et une matrice de 4 lignes, une colonne, constituée de 2 chaînes vides et de 2 zéros dans la troisième.
2. Modifiez GestPerso de manière à ce que la première société du fichier se charge automatiquement à l'ouverture. Pensez également à mettre à jour la propriété "Caption" de la fenêtre. Conseil : Ecrivez une fonction "GestPersoLoad" admettant en argument droit le numéro de société à charger et ouvrant le fichier uniquement le temps de récupérer les données. Cette fonction se chargera également du rafraîchissement de l'écran. Vous la réutiliserez plus tard.
3. Ajoutez un menu intitulé "Fichier" avec les éléments suivants : - Ouvrir Société qui ouvre une nouvelle fenêtre avec une combo contenant la liste de toutes les sociétés. Une fois la société choisie, cet écran se referme et elle est chargée à l'écran via GestPersoLoad.
- Nouvelle Société Ce choix provoque l'ouverture d'une nouvelle fenêtre avec - un champ pour saisir le
nom de la nouvelle société Lorsque le nom de la société est saisi et validé on l'ajoute à la liste des sociétés dans la première composante, on crée une nouvelle composante contenant une matrice de 4 lignes, une colonne, constituée de 2 chaînes vides et 2 zéros et on affiche le tout à l'écran.
- Supprimer la Société actuelle Si cette option est choisie, on commence par demander confirmation de la société en reprécisant bien son nom dans la question. Si la suppression est confirmée, on opère les changements suivants sur le fichier : - dans la première composante on met
iota zéro (¼0)
à la place du nom de la société effacée. Enfin, on affiche la première société à l'écran. - Sauver et Quitter : Comme le bouton mais on sauve dans le fichier - Quitter sans sauver : Comme le bouton.
4. A l'aide de GestPerso, saisissez le personnel de MyBaby : - Tanguy, homme, 27 ans, 25 keuro/an Sauvez puis créez la société MyHome et saisissez son personnel : - Eric, homme, 37 ans, 35 keuro/an
5. Le département comptabilité voudrait un fichier texte des noms et salaires pour chaque société. Fichier sur 2 colonnes : nom;salaire Exemple : Pierre;40 Ajoutez un menu "Export Salaires" juste avant "sauver et quitter" qui, au moyen d'un objet FileBox, permet de choisir précisément le nom et l'emplacement du fichier. Le nom proposé par défaut sera "Salaires société.txt"
6. Enregistrez votre travail avec )save. Solutions :
1. Créez un fichier à composantes intitulé PersoGroup, dans le même répertoire que votre ws. Numf„(Rep,'PersoGroup')ŒFCREATE 0
La première composante servira de sommaire. Dans un premier temps, mettez simplement "MyStyle Ltd" et "MyBaby" dans la première composante : 'MyStyle Ltd' 'MyBaby' Œfappend Numf
, le contenu de la variable Perso dans la deuxième : Perso Œfappend Numf
et une matrice de 4 lignes, une colonne, constituée de 2 chaînes vides et de 2 zéros dans la troisième. (4 1½'' '' 0 0) Œfappend Numf
on ferme ensuite le fichier : Œfuntie Numf
2. Modifiez GestPerso de manière à ce que la première société du fichier se charge automatiquement à l'ouverture. Pensez également à mettre à jour la propriété "Caption" de la fenêtre. Conseil : Ecrivez une fonction "GestPersoLoad" admettant en argument droit le numéro de société à charger et ouvrant le fichier uniquement le temps de récupérer les données. Cette fonction se chargera également du rafraîchissement de l'écran.
On commence par localiser les variables soc (nom de société) et chemin (chemin du ws) dans la fonction GestPerso : GestPerso;F1;tmp;PersoLoc;soc;chemin
Toujours dans GestPerso, vers le début de la fonction, on renseigne la variable "chemin" :
©
Chemin du ws
Texte de GestPersoLoad :
GestPersoLoad d;Numf Cette fonction reprend la plupart des lignes de GestPerso puisqu'elle écrase après coup certaines propriétés des objets tels que les valeurs du grid principal ou les types de cellules. On appellera cette fonction juste avant l'activation de l'écran (ŒDQ) en chargeant la première société du fichier : GestPersoLoad 1 3. Ajoutez un menu intitulé "Fichier" avec les éléments suivants : - Ouvrir Société qui ouvre une nouvelle fenêtre avec une combo contenant la liste de toutes les sociétés. Une fois la société choisie, cet écran se referme et elle est chargée à l'écran via GestPersoLoad. Nouvelles lignes dans GestPerso :
'F1.MB'ŒWC'MenuBar'
Texte de la fonction GestPersoOpen :
GestPersoOpen;Numf;FS;ListSoc;res;ls2
- Nouvelle Société Ce choix provoque l'ouverture d'une nouvelle fenêtre avec - un champ pour saisir
le nom de la nouvelle société Lorsque le nom de la société est saisi et validé on l'ajoute à la liste des sociétés dans la première composante, on crée une nouvelle composante contenant une matrice de 4 lignes, une colonne, constituée de 2 chaînes vides et 2 zéros et on affiche le tout à l'écran. Nouvelle ligne de menu dans GestPerso : 'F1.MB.M1.NS'ŒWC'MenuItem' '&Nouvelle Société'('Event' 'Select' 'GestPersoNew')
Texte de la fonction GestPersoNew :
GestPersoNew;Numf;FS;ListSoc;res;msg;place
- Supprimer la Société actuelle Si cette option est choisie, on commence par demander confirmation de la société en reprécisant bien son nom dans la question. Si la suppression est confirmée, on opère les changements suivants sur le fichier : - dans la première composante on
met iota zéro (¼0)
à la place du nom de la société effacée. Enfin, on affiche la première société à l'écran. Nouvelle ligne de menu dans GestPerso : 'F1.MB.M1.DS'ŒWC'MenuItem' '&Supprimer la Société actuelle'('Event' 'Select' 'GestPersoDel')
Texte de la fonction GestPersoDel :
GestPersoDel;Numf;FS;ListSoc;res;msg;place
Etant donné que la liste des sociétés peut désormais avoir des emplacements vides, il faut modifier la fonction GestPersoOpen de sorte qu'elle n'affiche que les sociétés valides :
GestPersoOpen;Numf;FS;ListSoc;res;ls2 - Sauver et Quitter : Comme le bouton mais on sauve dans le fichier Nouvelle ligne de menu dans GestPerso : 'F1.MB.M1.SQ'ŒWC'MenuItem' 'S&auver et Quitter'('Event' 'Select' 1)
Mise à jour du code de GestPerso concernant la sauvegarde :
© Sauver et Quitter
- Quitter sans sauver : Comme le bouton. Nouvelle ligne de menu dans GestPerso : 'F1.MB.M1.QSS'ŒWC'MenuItem' '&Quitter sans sauver'('Event' 'Select' 1)
Mise à jour du code de GestPerso concernant la sortie sans sauvegarde :
© Quitter sans Sauver
5. Le département comptabilité voudrait un fichier texte des noms et salaires pour chaque société. Fichier sur 2 colonnes : nom;salaire Ajoutez un menu "Export Salaires" juste avant "sauver et quitter" qui, au moyen d'un objet FileBox, permet de choisir précisément le nom et l'emplacement du fichier. Le nom proposé par défaut sera "Salaires société.txt" Nouvelle ligne de menu dans GestPerso : 'F1.MB.M1.EX'ŒWC'MenuItem' 'E&xport salaires'('Event' 'Select' 'GestPersoExport')
Texte de la fonction GestPersoExport :
GestPersoExport d;tmp;numf;FB
Texte final de la fonction GestPerso :
GestPerso;F1;tmp;PersoLoc;soc;chemin;ListSoc;place |
|