Lire à partir d'un fichier texte [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 13-06-2003 à 12:50:29
Yoyo@ a écrit : Salut, |
oui bien sûr, tu peux faire de la gestion de fichier "classique", un peu comme ds les autres langages:
Ouverture du fichier -> Open fic for Input/output As #1
lecture d'une ligne -> Line input #1, ligne
écriture -> Print #1,ligne
Fermeture du fichier -> Close #1
T'as pleins d'instructions de ce genre pour manipuler les fichiers... ça c celles que j'utilise mais t pas obligé de faire pareil
Marsh Posté le 13-06-2003 à 13:53:34
Yonel a écrit : |
Super, merci!
J'essaie tout ca alors
Marsh Posté le 13-06-2003 à 16:12:23
Perso, je préfère passer par FSO et la méthode OpenTextFile
Mais ça dépends de la structure du fichier...
Si c'est du CSV, il vaut mieu utiliser FSO, lire ligne par ligne.
Tandis que si c'est un fichier plat (avec champs de taille fixe), il vaut mieu lire avec des read #1, car tu pourras lire directement des records (structures en C), ce qui permet de lire et stocker plusieurs champs d'un coup.
Exemple pour le 2 :
Code :
|
Vachement pratique
Marsh Posté le 13-06-2003 à 18:46:43
MagicBuzz a écrit : Perso, je préfère passer par FSO et la méthode OpenTextFile
|
Euh, FSO, c'est quoi?
Et dans ton code, tu fais quoi?
Sinon, si mon fichier était du CSV, je l'aurais directement importé dans une table ! C'est un fichier que j'éditerai à la main et que j'analyserai avec du code, donc à la fois avec un formatage spécial (pour qu'il soit analysable) et lisible (pour qu'il soit éditable à la main, et agréable à lire!)
Marsh Posté le 13-06-2003 à 23:07:38
FSO : FileSystemObject
C'est un objet de WSH (Windows Scripting Host) qui est très performant et assez pratique.
Cherche de l'aide dessus, perso, mise à par quand il faut un accès binaire, j'utilise toujours cet objet qui est très simple et très puissant dès que je dois accéder au système de fichier.
Dedans, très à peut près toutes les fonctions que tu peux avoir dans l'explorateur Windows : ça va de l'accès réseau à l'identification du type de FS sur les disques, en passant par la manipulation de répertoires ou l'accès à des fichiers en mode texte (n'importe quel charset)
Sinon, dans le code que j'ai posté, en fait je crée un type utlisateur "struct".
Par exemple :
Type T_PERSONNE |
Ensuite, je remplis la structure avec des infos :
Dim personne as T_PERSONNE |
Puis j'écrit le record dans le fichier en mode binaire :
Put #1, , personne |
=> Il en résulte dans le fichier :
Durant André andre.durant@free.fr M32 |
Et je peux ensuite relire le record :
Get #1, , personne |
=> Ma variable "personne" se rempli automatiquement avec tous les champs. C'est carrément super pratique pour bosser avec des fichiers plats.
Marsh Posté le 13-06-2003 à 23:10:34
MagicBuzz a écrit : FSO : FileSystemObject |
j'avoue que ça a l'air puissant... pkoi t'as pas posté ça 2 mois plus tôt ?
Marsh Posté le 13-06-2003 à 23:14:29
PS: le coup des record, ça n'a rien à voir avec FSO, là c'est la fonction native que VB, qui n'a que cet intérêt, pour le reste elle est toute pourrie.
Marsh Posté le 13-06-2003 à 23:44:01
Sinon, quand je dis que FSO est TRES performant, je m'en remet à ça : (ça mérite évolution, mais ça donne déjà une bonne idée de la puissance du truc et de sa rapidité)
Code :
|
Enregistre ça dans un fichier *.vbs et fait-le tourner (change au besoin le lecteur g:, c'est chez moi un disque de 80 Go remplis à raz-bord de MP3 et drivers)
Temps d'éxécution : 5 secondes et demie.
Quand je fais un clic droit dans l'explorateur Windows pour afficher les propriétés du répertoire racine, j'attends plus de 20 secondes
(je parle même pas de faire un dir g: /s > liste.txt )
Marsh Posté le 13-06-2003 à 23:53:11
MagicBuzz a écrit : |
ah vi sympatique. ton script met moins de 4s chez moi pour une partition de 100Go. Par contre c bizarre parce que les propriétés de la racine sont instantanées chez moi. Ptet parce que t'as plein de ptits fichiers
Marsh Posté le 13-06-2003 à 23:58:38
Non, sélectionne tous les répertoires à la racine puis fait propriété (pour voir le détail)
Sinon, il se contente de regarder le type de fs et la taille dispo
Marsh Posté le 14-06-2003 à 00:00:27
MagicBuzz a écrit : Non, sélectionne tous les répertoires à la racine puis fait propriété (pour voir le détail) |
oui c vrai mais même ça c instantané chez moi. ça doit être parce que t'as plein de ptits fichiers. Moi c des gros... 700Mo chacun à peu près
Marsh Posté le 14-06-2003 à 00:02:41
Bah ouais, moi j'ai des MP3, c'est 100 fois plus petit que des DivX
Marsh Posté le 14-06-2003 à 00:04:57
PS: Tiens, oui, c'est chelou
En fait, j'avais pas regardé... Avec Windows 2003, c'est instantanné !
Alors qu'avec Windows 2000, ct super long
Marsh Posté le 14-06-2003 à 00:07:55
MagicBuzz a écrit : Bah ouais, moi j'ai des MP3, c'est 100 fois plus petit que des DivX |
qui a dit que c'était des divx ?
Marsh Posté le 14-06-2003 à 00:09:21
MagicBuzz a écrit : PS: Tiens, oui, c'est chelou |
ouep je sais pas... ya ossi le fait que je suis en NTFS, ça c'est un truc qui t'accélère ce genre de traitements... par contre le fait que ce soit plus rapide selon l'OS je vois pas vraiment ou serait la logique
Marsh Posté le 15-06-2003 à 09:03:24
Moi aussi je suis en NTFS.
Bah selon l'OS, ce sera plus ou moins rapide tout simplement parceque pour la NTFS justement, elle évolue à chaque sortie d'OS.
La NTFS 5 (Windows 2000) ne stockait pas d'infos quant au nombre de fichiers contenus dans un répertoire ni leur taille. Du coup, il fallait lire les infos de chaque fichier pour retrouver la taille d'un répertoire.
Visiblement, avec XP/2003 (NTFS 5.1) ils ont rajouté cette information au niveau du répertoire lui-même, ce qui fait que c'est instantané à lire.
Marsh Posté le 16-06-2003 à 16:12:57
Salut !
Je viens d'essayer tes méthodes avec les FSO, en exécutant le tout sous Access ! powerful !
En fait, ca vient d'ou tout ca? Ce sont des objects Windons? Bien sur, je ne trouve rien concernant tout ca dans l'aide Access (normal...)
Pour ma part, ce que je voudrais, c'est pouvoir utiliser un texte édité à la main (a priori, ce sera une liste quelconque) et pourvoir lire ligne par ligne, par exemple dans uene boucle (mais peu importe) et pour chaque ligne, la mettre dans une String pour l'analyser sous VB (par exemple, si je trouve certains caratceres de formatage, alors je pourrais faire des déductions, etc....)
Concernant le FSO, je suis sous XP (Access Xp + Windows XP) ! Si j'utilise un tel object, est ce que je serai sur que ca tournea par exemple sous Win98 + Access97?
Que me conseilles tu alors?
Marsh Posté le 16-06-2003 à 17:19:34
FSO est un objet de WSH.
WSH est la couche de script de Windows.
FSO nécessite la version 5.1 de WSH.
Cette version est intégrée à IE4, donc Windows 98 en natif, et Windows 95 une fois IE4 installé
Donc en gros : oui, ça tournera sur n'importe quelle machine.
Sinon, si c'est pour lire ligne par ligne, alors à nouveau c'est FSO qui va te servir (et pourtant, dieu sait s'il est limité pour ce qui est des accès fichiers )
dim fso, fil
dim maligne
set fso = createobject("Scripting.FileSystemObject" )
set fil = fso.OpenTextFile("c:\toto.txt", je sais plus les paramètres)
do while not fil.EndOfStream
msgbox(fil.readline)
loop
fil.close
Marsh Posté le 16-06-2003 à 21:56:31
MagicBuzz a écrit : FSO est un objet de WSH. |
Merci pour ton aide !
J'ai finalement utilisé un truc du genre :
Open "c:\Essai.txt" For Input As #1
Line Input #1, myString
...
Close #1
Ca marche très bien pour ce que je veux en faire, et ca engloutit les lignes les unes apres les autres! (une ligne étant séparée dune autre par un Chr(13) ou un Chr(13)&Chr(10)
Voilà,
Yoyo*
Marsh Posté le 13-06-2003 à 12:00:42
Salut,
je voudrais savoir si il est possible, à partier de VBA, et sans passer par des tables (importation/exportation) de lire/écrire du texte à partir d'un fichier externe....
Merci,
Yoyo*