Utiliser un fichier texte comme base de donnée

denis730 Messages postés 19 Date d'inscription jeudi 18 novembre 2004 Statut Membre Dernière intervention 29 mars 2007 - 18 déc. 2005 à 12:30
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 - 19 déc. 2005 à 02:10
Bonjour,

J'ai besoin d'utiliser une table de 300 enregistrements et 3 champs. L'application qui va renseigner cette table ne sait que créer des fichiers textes or je maitrise assez mal les fonctions liées au fichier texte en VB si ce n'est "readline" et "writeline". Comment faire pour compter le nombre de ligne, se deplacer de colonne en colonne, descendre ou remonter de plusieurs lignes et saisir les variables qui m'interesse. Les champs doivent ils etre separé par des tabulations, des virgules etc...

Merci

1 réponse

ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
19 déc. 2005 à 02:10
Ton histoire n'est pas claire !
Déjà, pense à toujours nous préciser avec quel language et quelle version tu codes (VBA, VB6, VBS, VB.NET, ...).

Qu'est-ce que tu cherches à faire ? Une application qui lit et modifie une DB sous forme de fichiers ?
Lorsque tu dis que l'application qui crée cette table ne sait créer que des fichiers, de quelle application parles-tu et quel est le format des fichiers ???

Tant de questions en suspend! Parce que rien n'est plus simple, en VB, que de manier des fichiers texte.

Enfin, pour répondre à ta question, il y a plusieurs moyens de créer des fichiers texte de DB. Il y a les languges balisés (XML, ...) mais le meilleur reste la séparation des données via un caractère.
Ce caractère, en effet, par convention est généralement le tabulateur car peut utilisé dans le language courant.
Mais en réalité, tu peux utiliser celui que tu veux du moment qu'il ne rentre pas en conflit avec le contenu des datas (données). Par exemple, on emploi également beaucoup le ";" et la "," comme séparateur de données.
Dans Excel par exemple, tu peux parfaitement ouvrir un fichier de ce type en précisant cependant le caractère de séparation des champs.
Ce type de fichiers est le ".CSV" bien qu'il ne semble pas qu'il ait été normalisé... !

Pour séparer les champs, soit tu fais un retour chariot (Carriage Return [CR]), c'est à dire, en utilisant soit la constance VB nomée : "vbNewLine", soit en utilisant la fonction "CHR(codeASCII)" avec pour code ASCII, soit 13, soit 10, soit la combinaison des deux { CHR(10) +/& CHR(13) } mais pas { CHR(10+13) } auquel cas se serait comme écrire { CHR(23) }. Cependant, tu peux aussi ne pas prendre en compte le changement d'enregistrement en ne te fiant qu'a la structure de ton fichier ce qui te permettra de disposer toutes les données à la suite les unes des autres. Mais gare à la moindre erreur dans la structure de tes datas qui rendrait ton programme complètement fou. Autrement dit, coder comme ça est facile mais plus dangereux.

Pour manipuler les fichiers tu dois te servir de l'instruction "Open". Le plus simple pour la manipulation des fichiers texte reste la manière séquentielle. C'est à dire, de soit lire soit écrire les données et de le faire dans leur ordre d'apparition. Autrement dit, de manière linéaire par opposition à la manière "cartographique" où l'on indiquerait la position de la donnée à lire ou écrire.

'Déclaration des variables :
Dim tblDatas(3,300) As String 'Tableau contenant les données

Dim varEnregistrement As Integer 'Compteur pour lire/écrire les données
'Numéro des canaux d'identification des fichier ouverts
Dim varCanal1 As Byte
Dim varCanal2 As Byte

varCanal = FreeFile 'Le premier canal vide (le "1" normalement !
Open " C:\chemin d'acces du fichier\fichier.ext " For Input As varCanal1
varEnregistrement = 0
'On lit les données : tant que la fin du fichier n'est pas atteinte
Do While Not(EOF(varCanal1)) 'Autrement dit, on lit le fichier jusqu'a la fin (EOFTRUE> FIN du fichier)
'On lit les données séquentiellement, par paquet de 3 donc et on les met directement dans le tableau
Input #varCanal1, tblDatas(1, varEnregistrement)
Input #varCanal1, tblDatas(2, varEnregistrement)

Input #varCanal1, tblDatas(3, varEnregistrement)

'Incrémentation du compteur
varEnregistrement = varEnregistrement + 1
Loop 'On reprend la boucle DO/LOOP
'varEnregistrement devrait être égale à 300 donc.
Close varCanal2

'Ici, on peut afficher et/ou modifier les données :

'On modifie une entrée :
tblDats(1,2) = "DONNÉE VIDE"
'On efface la fenêtre active (Me représentant la fenêtre active quelque soit son nom [pratique!]).
Me.Cls
'On va afficher les 20 premiers enregistrements
For t = 1 To 20
'On écris directement sur la fenêtre
Me.Print tblDatas(1,t) & " / "; 'Le ";" sert à ne pas générer un retour chariot
Me.Print tblDatas(2,t) & " / ";
Me.Print tblDatas(3,t) & " / "
Next t

'On enregistre le fichier.
varCanal2 = FreeFile
Open " C:\chemin d'acces du fichier\fichier.ext " For Output As varCanal2
Do While Not(EOF(varCanal2))
Print #varCanal2, tblDatas(1, varEnregistrement);
Print #varCanal2, tblDatas(2, varEnregistrement);
Print #varCanal2, tblDatas(3, varEnregistrement)
varEnregistrement = varEnregistrement + 1
Loop 'On reprend la boucle DO/LOOP

Close varCanal2

Mais attention, ce n'est qu'a titre d'exemple car je n'ai pas testé le code ci-dessus (fait de tête et donc, syntaxe à vérifier!!!). De plus, il ne fonctionne que si les données sont séparés par des virgules (je crois, ou alors c'est des ";"... je confonds tout le temps!). Quoi qu'il en soit, regarde dans la MSDN (l'aide du VB) pour avoir toutes les précisions.

Si tu veux employer des caractères de tabulation tu devras, si tu veux employer cette technique de manipulation des fichiers, une petite routine de traitement de texte. Car, en effet, dans ce cas, il ne faut pas employer "Input" (qui ne prend que les données entres virgules [ou points virgules donc {???}]) mais "Line Input" qui saisira toute une ligne. C'est à dire, jusqu'a ce qu'elle rencontre un "vbNewLine" (constante Visual BASIC).
Il faudra donc faire un truc du genre (fait de tête) :

Dim varTexteTemporaire As String
...
Line Input #varCanalFichierX,
varTexteTemporaire
tblDatas(xx,yy) = Mid(varTexteTemporaire, 1, Split(varTexteTemporaire, CHR(9)) - 1)
varTexteTemporaire = Mid(varTexteTemporaire, Split(varTexteTemporaire, CHR(9)) + 1, Len(varTexteTemporaire) - Split(varTexteTemporaire, CHR(9)))

Split étant une fonction de recherche d'une occurence
(séquence de texte) - ici j'ai employé le caractère ASCII de tabulation
[enfin, de mémoire c'est le 9 mais c'est peut-être autre chose... pi
doit bien y avoir une constance VB pour ça... à toi de chercher et de
me dire en retour!] - qui renvoie l'emplacement du 1er caractère de la
chaîne textuelle à rechercher
de la première occurence (apparition) trouvée dans la chaine textuelle de base. Par exemple :

'emplacement = Split("abcdabcd","cd")

'Emplacement renverra 3 car le 1er caractère de la première occurence
(oui, car il y a bien 2 fois la chaine "cd"!!!) de la chaîne "cd"
recherchée trouvée dans la chaîne de base est à le 3 ème caractère dans
cette même chaîne.

Mid sert à extraire (copier) une portion de texte d'une chaine de base.
Mid(chaîne de base, N° du caractère de début, nombre de caractère) = chaine
Mid("abcdefgh", 3, 2) => "cd"
Il faut penser, non pas en nombre réels (à virgules) mais en nombres entiers :
a=1 b=2 c=3 d=4 e=53+2 5 !!! Oui, mais comme le "c" est inclus, il faut faire en fait : 2 + 2 4 !!!
Bref, ce n'est qu'une question d'habitude.
"Len(chaîne)" donnant tout simplement le nombre de caractères dans une chaîne de texte!

Bon, je m'arrête là parce que je suis entrain de filer un cours pour newbies et ce n'est franchement pas mon rôle!!!

Alors, soit un peu plus précis dans tes questions/réponses à l'avenir MERCI.

Bon, dit moi donc ce que tu as compris, pas compris et si ça répond ou non à ton problème.

Enjoy

<hr size="2" width="100%">
( Si une réponse vous convient, cliquez sur le bouton "Réponse acceptée". )
0
Rejoignez-nous