Lire et écrire des fichiers texte avec excel : accès aléatoire et accès binaire
L'accès aléatoire
Contrairement à l'accès séquentiel, l'accès aléatoire permet de travailler simultanément en lecture et écriture sur un fichier ouvert. Le travail avec les fichiers aléatoires repose sur les Types définis par l'utilisateur. Je vous reporte à la structure "Type personnage"
type personnage
nom as string * 40 'Garde 40 caractères pour le nom
age as byte 'Maximun de 256 ans par personne
sexe as string * 8 'Masculin = 8 caractères, Féminin = 7 caractères
end type
dim personnes(10) as personnage 'Établir un tableau de 10 personnes à 3 données par personne
Un type défini par l'utilisateur débute par l'instruction type et se termine par l'instruction End Type. Contrairement aux tableaux traditionnels, qui sont limités à un seul type de données, les types définis par l'utilisateur permettent de regrouper sous une structure unique des types différents de données. C'est ainsi qu'il est possible de traiter ensemble des textes et des nombres.
L'instruction dim, permet de déclarer un tableau contenant 10 ensembles correspondant à personnage.
Pour accéder à un élément particulier du tableau, il suffit de l'appeler en mettant l'indice. Par exemple, pour appeler le nom du premier individu on mettra:
lenom = personnes(1).nom
Pour le sexe de la dixième personne:
lesexe = personnes(10).sexe
Notons, en passant, que le type défini par l'utilisateur peut être utilisé ailleurs qu'avec des fichiers à accès aléatoire.
Pour en revenir à nos fichiers proprement dits, nous pouvons dire, en comparaison avec les fichiers à accès séquentiel, qu'ici la longueur des enregistrements est fixe. Cela signifie donc, que si nous mettons un nom de 20 caractères dans un espace, (certains disent un champ) prévu pour 40 (cela pourrait aussi bien être 60 ou 100, que 10, c'est à la discrétion du programmeur, en fonction des besoins), il y aura obligatoirement 20 blancs d'ajoutés au bout du nom. C'est pour cela qu'il est tout indiqué de les supprimer avec rtrim(), après la lecture du fichier et avant toute
opération. (Sinon, toutes vos comparaisons vont planter et vous risquez d'avoir des problèmes de formatage).
En contrepartie, un nom qui aurait plus de 40 caractères, serait purement et simplement tronqué à partir du 41e caractère. C'est donc dire qu'il faut choisir avec soin la taille maximale des enregistrements. Il faut souvent faire un compromis entre la capacité d'emmagasiner tous les noms possibles et impossibles, et le fait que la taille des fichiers augmente en conséquence.
Contrairement à un fichier à accès séquentiel, on peut accéder directement à une information d'un fichier à accès aléatoire sans lire toutes les données précédentes. Cependant, si vous effacez des données dans un fichier de ce type, il est avantageux de réécrire de nouvelles données à la place des données effacées. Sauf erreur de ma part, VBA ne compacte pas ces fichiers automatiquement. Il faut donc éviter de laisser des blancs inutiles. Vous noterez que c'est pour cela que les systèmes de gestion de bases de données ont un utilitaire de compactage des fichiers de bases de données.
L'ouverture de ce type de fichier passe par l'instruction suivante:
open "fichier" for random as numfichier len = len(type défini par l'utilisateur)
S'il n'y a pas de fichier d'ouvert, le fichier peut prendre n'importe quel numéro choisi par le programmeur. Pour ma part, le premier fichier que j'ouvre prend, je ne sais pas pourquoi, le numéro 1. Comme c'est moi qui décide, je décrète que mon fichier s'appelle Gaston.don .
Donc:
Open "Gaston.don" for random as 1 len = len (personnage)
La longueur s'exprime en octets, calculée principalement sur ces bases.
Pour des textes : 1 octet par caractère, incluant les blancs. donc String * 40 veut dire 40 octets.
Pour des nombres:
Byte : 1 octet
Integer (Entier) : 2 octets
Long (Entier long) : 4 octets
Single (Virgule flottante en simple précision) : 4 octets
Double (Virgule flottante en double précision) : 8 octets
Si vous écrivez un nouveau fichier, vous pouvez utiliser un compteur comme numéro d'enregistrement. Si vous ajoutez des données à un fichier existant, il est nécessaire de connaître le numéro d'enregistrement. Pour ajouter des données à la fin, le numéro de l'enregistrement s'obtient au moyen du calcul suivant
Noenregistrement = LOF(#fichier) \ len(type)
La fonction LOF (Length Of File) donne la longueur du fichier. Le \ représente l'opérateur de division entière, qui donne un entier comme réponse. 4 donne 1
Pour écrire une donnée
Put #numfichier, numéro d'enregistrement, variable d'enregistrement
Pour lire une donnée
Get #numfichier, numéro d'enregistrement, variable d'enregistrement.
La recherche d'un enregistrement existant est un peu plus compliquée. À défaut de connaître le connaître le numéro d'enregistrement, il faut y aller par itérations, pour retrouver le numéro correspondant à la donnée cherchée. Pour faciliter ce type de recherche des esprits brillants ont inventé les fichiers d'indexation. Ces fichiers sont utilisés pour stocker l'emplacement d'une donnée déterminée dans un fichier aléatoire.
L'accès binaire
Le mode d'accès binaire permet d'écrire, ou de lire octet, par octet. Cela permet donc de modifier directement n'importe quel fichier, Exécutable, base de données, fichier Excel, Word. etc.). Il suffit de savoir à partir de quel octet, et le nombre d'octets qu'il faut lire ou écrire. Si le fait de se tromper en lecture ne risque pas d,endommager le fichier, il en est tout autrement en écriture. Il suffit de se tromper d'un octet pour foutre en l'air.
Ce mode d'accès binaire, permets également de définir un format de fichier selon ses propres critères. Il faut s'assurer que que la façon dont le fichier est lu est compatible avec la façon dont il est écrit.
Dans ce cas, l'instruction seek, est utilisée pour se déplacer à l'octet où doit débuter la lecture ou l'écrire.
L'instruction Get permet de lire un certains nombre d'octets.
L'instruction Put permet d'écrire dans le fichier.
Auteur : Clément Marcotte
Mots clefs associés à cette page : texte, lire, écrire
- Vous devez vous identifier ou créer un compte pour écrire des commentaires
