Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2389 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VB] Disposer les informations d'un fichier dans un tableau

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VB] Disposer les informations d'un fichier dans un tableau

n°450802
urd-sama
waste of space
Posté le 08-07-2003 à 10:19:53  profilanswer
 

Bonjour  :hello:  
 
Je suis en train de faire un programme en vb pour de l'intranet. l'utilisateur devra télécharger le programme. Ce dernier devra récupérer les informations d'un fichier sur un share, puis offrir un éventail de possibilité à l'utilisateur, et en dernier lieu créera une arborescence de fichier.
 
Pour le moment je suis en train de regarder la récupération des informations du fichier. Ce dernier se compose selon le modèle suivant. chaque ligne représente un document précis, elle-meme composée de différentes infos:
 
Abréviation|Description|Small|Medium
ABC|Document numéro 1|oui|non
DBC|Document numéro 2|non|non
 
je pensais utiliser un tableau dans un tableau. le tableau 1 contiendrait le tableau 2 qui contient chaque info splittée de la ligne. (est-ce compréhensible?)
 
est-ce une bonne idée ou trop compliquée ou encore mauvaise? Je n'ai jamais utilisé de VB jusqu'à présent et j'ai de la peine à m'y habituer.
 
Merci pour votre aide future, j'en aurai bien besoin [:ruisseau de larmes]


Message édité par urd-sama le 08-07-2003 à 10:20:08
mood
Publicité
Posté le 08-07-2003 à 10:19:53  profilanswer
 

n°450807
drasche
Posté le 08-07-2003 à 10:22:49  profilanswer
 

cfr la FAQ, j'ai posté un message sur les tableaux ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°450810
urd-sama
waste of space
Posté le 08-07-2003 à 10:26:40  profilanswer
 

mais est-ce que c'est une bonne idée? pas que je me lance dans un truc moisi?
 
sinon j'ai un petit problème pour affecter la valeur de la ligne dans mon tableau, je suppose que l'erreur est stupide mais je trouve pas  :sweat:  
 

Code :
  1. Private Sub cmdLire_Click()
  2.   Dim fso As New FileSystemObject
  3.   Dim strName As String
  4.   Dim strm As TextStream
  5.   Dim tabDocument() As String
  6.   Dim sDocument As Variant
  7.   Dim i As Integer
  8.  
  9.   strName = "A:/test.txt"
  10.  
  11.   Set strm = fso.OpenTextFile(strName, ForReading, False)
  12.   i = 0
  13.   With strm
  14.     Do
  15.       ReDim Preserve tabDocument(i)
  16.       'l'erreur est ici:
  17.       tabDocument(i) = .ReadLine
  18.       'lblFichier.Caption = lblFichier.Caption & .ReadLine & vbCrLf
  19.       i = i + 1
  20.     Loop Until .AtEndOfStream
  21.     .Close
  22.   End With
  23. End Sub


ps: l'erreur est "input past end of file"


Message édité par urd-sama le 08-07-2003 à 10:27:51
n°450850
drasche
Posté le 08-07-2003 à 10:45:30  profilanswer
 

je te suggère de faire ton test en début de boucle plutôt qu'à la fin, l'erreur se produit apparemment parce que ton fichier est vide.
 
Ensuite, non, ce n'est pas moisi pour autant que tu saches à l'avance ce que contient ton fichier ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°450854
drasche
Posté le 08-07-2003 à 10:46:37  profilanswer
 

ah et une dernière chose: les Dim objet as New TypeMachin, c'est mal :D


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°450864
urd-sama
waste of space
Posté le 08-07-2003 à 10:51:00  profilanswer
 

drasche a écrit :

je te suggère de faire ton test en début de boucle plutôt qu'à la fin, l'erreur se produit apparemment parce que ton fichier est vide.


si j'affiche le texte dans le label (instruction en dessous) ca ne me fait pas d'erreur et ca marche correctement.  [:spamafote]  
et concernant le dim object, je dois le déclarer en public pour faire bien?

n°450907
drasche
Posté le 08-07-2003 à 11:20:38  profilanswer
 

:non: une variable déclarée dans une procédure est toujours un Dim.
 
Si tu veux l'utiliser dans toute ta form, tu peux le déclarer en "Private" au lieu de "Dim" en tête de la form et l'instancier/détruire dans le Load/Unload de la form.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°450908
urd-sama
waste of space
Posté le 08-07-2003 à 11:22:49  profilanswer
 

drasche a écrit :

:non: une variable déclarée dans une procédure est toujours un Dim.
Si tu veux l'utiliser dans toute ta form, tu peux le déclarer en "Private" au lieu de "Dim" en tête de la form et l'instancier/détruire dans le Load/Unload de la form.


d'accord merci  :jap:  
 
j'ai essayé de faire un do while not .AtEndOfStream mais l'erreur est toujours la meme  [:spamafote]

n°450916
drasche
Posté le 08-07-2003 à 11:30:03  profilanswer
 

Urd-sama a écrit :

j'ai essayé de faire un do while not .AtEndOfStream mais l'erreur est toujours la meme  [:spamafote]  


j'ai essayé avec C:\test.txt à vide et forcément il rentre jamais dans la boucle :whistle:
 
en remplissant le fichier ça allait un peu mieux [:boidleau]
 
Une autre solution est de lire tout d'un coup et d'organiser un split sur base du retour chariot, puis pour chaque ligne sur ton séparateur de tableau. Ca a l'avantage de lire le fichier en une seule fois [:spamafote]  Et il ne faudra pas perdre de vue que ce sera des tableaux (chaque ligne) dans un tableau (l'ensemble des lignes).


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°451006
urd-sama
waste of space
Posté le 08-07-2003 à 13:19:22  profilanswer
 

par un hasard fort hasardeux, j'ai pu refaire fonctionner selon l'idée initiale (no comment).
par contre à présent l'erreur est autre part:
 

Code :
  1. Private Sub cmdLire_Click()
  2.   Dim strName As String
  3.   Dim strm As TextStream
  4.   Dim tabDocument() As String
  5.   Dim tabLigne() As String
  6.   Dim sDocument As Variant
  7.   Dim i As Integer
  8.   Dim sText As Variant
  9.  
  10.   strName = "A:/test.txt"
  11.  
  12.   Set strm = fso.OpenTextFile(strName, ForReading, False)
  13.   i = 0
  14.   With strm
  15.     Do
  16.       ReDim Preserve tabDocument(i)
  17.       tabLigne = Split(.ReadLine, "|" )
  18.       '--> voilà ce que j'aimerais faire, mais ca me fait une erreur
  19.       tabDocument(i) = tabLigne()
  20.       i = i + 1
  21.     Loop Until .AtEndOfStream
  22.     .Close
  23.   End With
  24. End Sub


 
donc en résumé, j'ai réussi à splitter la ligne dans un premier tableau. ce qu'il me faut maintenant, c'est mettre ce tableau dans l'autre tableau de rang i. l'erreur sortie est "type mismatch". une idée?

mood
Publicité
Posté le 08-07-2003 à 13:19:22  profilanswer
 

n°451019
drasche
Posté le 08-07-2003 à 13:30:13  profilanswer
 

arf zut j'ai pas su poster mon code avant midi, le voilà:
 

Code :
  1. Public Sub Main()
  2.     Dim objFSO As Scripting.FileSystemObject
  3.     Dim tsInput As Scripting.TextStream
  4.     Dim aryInfo() As Variant
  5.     Dim l As Long
  6.     ' Get file system object
  7.     Set objFSO = New Scripting.FileSystemObject
  8.     ' Open a readonly stream
  9.     Set tsInput = objFSO.OpenTextFile("c:\text.txt", ForReading)
  10.     ' Initialise array index
  11.     l = 0
  12.     ' read the file 'til the end
  13.     Do While Not tsInput.AtEndOfStream
  14.         ' add an item to the array
  15.         ReDim Preserve aryInfo(l)
  16.         ' read the line
  17.         aryInfo(l) = tsInput.ReadLine
  18.         ' split information in the line
  19.         aryInfo(l) = Split(aryInfo(l), vbTab)
  20.         ' get ready for the next line
  21.         l = l + 1
  22.     Loop
  23.     ' everything has been read!
  24.    
  25.     ' close stream
  26.     Call tsInput.Close
  27.     ' clean out objects
  28.     Set tsInput = Nothing
  29.     Set objFSO = Nothing
  30. End Sub


 
ça fait ce que tu voulais je crois [:boidleau]
j'ai tapé un truc comme ça il y a un temps donc c'était facile de m'en rappeler.
 
En ce qui concerne les assignations de tableau, celui qui reçoit doit être de type Variant.  Parce que tu essaies d'assigner un tableau à quelque chose (ici un élément de tableau), il ne peut donc être un type de base, donc tabDocument doit être déclaré Variant. Ca devrait le faire avec ça :)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°451078
urd-sama
waste of space
Posté le 08-07-2003 à 14:01:40  profilanswer
 

j'ai essayé de modifier le mien, et finalement j'ai pris le tien qui fonctionne très bien merci (tu me sauve  :cry: )
faut que j'apprenne à l'utiliser maintenant :/

n°451096
drasche
Posté le 08-07-2003 à 14:11:59  profilanswer
 

Remarques sur mon code:
Je mets toujours la librairie en préfixe du type (donc j'écris Scripting.FileSystemObject au lieu de FileSystemObject par exemple). Ca évite les confusions et certains problèmes potentiels de mise à jour de composants.
 
Quand je lis un recordset ou un fichier, je fais ma boucle en testant ma condition avant la première opération: ça évite les surprises du genre le recordset/fichier est vide.
 
Je ferme toujours mes streams/recordsets proprement puis destruction explicite de tous les objets (dans l'ordre inverse de création naturellement), je n'aime pas laisser VB faire quelque chose que je peux faire mieux que lui (il a ses limites).
 
J'ai jamais utilisé les slashes pour référencer un chemin ou un fichier (VB est 100% Windows, donc je raisonne en 100% Windows quand je programme en VB).
 
Puis l'astuce, je réassigne le tableau à lui-même bien que j'eu pu passer par une variable intermédiaire -> aryInfo(l) = Split(aryInfo(l), vbTab)
Mais ça c'est de la pure paresse :whistle:
 
Dès qu'un tableau doit recevoir des tableaux -> le déclarer As Variant.


Message édité par drasche le 08-07-2003 à 14:12:20

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°451105
urd-sama
waste of space
Posté le 08-07-2003 à 14:16:37  profilanswer
 

drasche a écrit :

Remarques sur mon code:
[...]


je ne peux que m'incliner  :jap:

n°451211
urd-sama
waste of space
Posté le 08-07-2003 à 15:17:48  profilanswer
 

j'ai encore une petite question, comment je fais pour accéder aux différentes informations du tableau? (un tit indice quoi  :) )

n°451216
drasche
Posté le 08-07-2003 à 15:22:50  profilanswer
 

L'expression aryInfo(1) permet d'accéder au sous-tableau inséré à l'indice 1.  Puisqu'il te renvoie un tableau, il te faut le traiter comme tel, ce qui donnera aryInfo(1)(2) par exemple pour à accéder au tableau indicé à 1, puis à l'élément indicé 2 de ce tableau.  Cfr la FAQ qui discute de cela aussi ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°451222
urd-sama
waste of space
Posté le 08-07-2003 à 15:24:44  profilanswer
 

donc théoriquement si j'appelle aryInfo(1)(1) il devrait m'afficher une valeur?

n°451224
drasche
Posté le 08-07-2003 à 15:26:42  profilanswer
 

oui :)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°451228
urd-sama
waste of space
Posté le 08-07-2003 à 15:31:19  profilanswer
 
n°451234
drasche
Posté le 08-07-2003 à 15:36:06  profilanswer
 


?


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°451243
urd-sama
waste of space
Posté le 08-07-2003 à 15:49:35  profilanswer
 

après 30 minutes de combat acharné j'ai réussis à lui faire afficher ce que je voulais [:banzai]
merci encore  :jap:

n°451752
urd-sama
waste of space
Posté le 09-07-2003 à 07:50:03  profilanswer
 

à présent j'ai un autre problème, plus avec le fichier, mais je continue quand meme dans ce sujet, étant donné que c'est toujours le meme programme  :jap:  
 
j'ai une list (Zone de liste) que j'ai transformé dans le style 1-Checkbox, histoire d'avoir les cases à cocher devant le nom de fichier.
 
A l'intérieur de mon code, je récupère et je fais un AddItem sur cette liste. Jusque là, aucun problèmes.
 
Par contre ce que j'aimerais faire, c'est pouvoir cocher ou non la case à cocher (suivant une information contenue ou non dans mon fichier). Et je n'ai absolument aucune idée de comment faire ça dans mon code  [:spamafote]  
 
si qqun à une idée, ca me sauverait  :(

n°451767
drasche
Posté le 09-07-2003 à 08:42:37  profilanswer
 

C'est la propriété Selected, avec entre parenthèses le numéro d'index (à partir de zéro) qui permet de faire ça.  Et l'évènement ItemCheck permet de savoir quand une case est cochée.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°451777
urd-sama
waste of space
Posté le 09-07-2003 à 08:48:33  profilanswer
 

donc je dois d'abord créer les lignes (additem) et ensuite appliquer l'attribut selected? ou je peux tout faire d'un coup?

n°451782
drasche
Posté le 09-07-2003 à 08:53:35  profilanswer
 

non pas tout d'un coup, d'abord AddItem, puis assigner le Selected (même chose si tu veux exploiter ItemData qui fonctionne comme un tableau de longs alors que Selected est un tableau de booléens).  Mais rien ne t'empêche de faire une procédure qui le ferait, histoire de faire un appel pour ajouter une ligne et toutes les infos associées ;)
 
Au fait ça se trouve dans MSDN :o
je dis ça parce que je vois bien le Moins Moins me dire que je fais du favoritisme :o
 
:D


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°451812
urd-sama
waste of space
Posté le 09-07-2003 à 09:24:08  profilanswer
 

merci  :jap:  
je vais chercher + amplement dans la doc  :)

n°451941
urd-sama
waste of space
Posté le 09-07-2003 à 11:09:44  profilanswer
 

j'ai trouvé, si ca intéresse qqun:

Code :
  1. lstDocument.Selected(i) = True


 

n°451942
drasche
Posté le 09-07-2003 à 11:10:38  profilanswer
 

ben euh c'était marqué dans mon post :heink:

n°451943
urd-sama
waste of space
Posté le 09-07-2003 à 11:11:23  profilanswer
 

drasche a écrit :

ben euh c'était marqué dans mon post :heink:


c'est ce que t'as écris traduit en vb  :D

n°451945
drasche
Posté le 09-07-2003 à 11:15:26  profilanswer
 

Urd-sama a écrit :

c'est ce que t'as écris traduit en vb  :D  


aaaah ok moi avais pas compris  :pt1cable:

n°451948
urd-sama
waste of space
Posté le 09-07-2003 à 11:20:37  profilanswer
 

nan c'est moi qui doit être lente  [:spamafote]  
au moins je commence à m'en sortir un peu avec ce vaibai

n°451950
drasche
Posté le 09-07-2003 à 11:24:40  profilanswer
 

VB c'est bieng :o  (attention ami lecteur, un troll est caché dans cette phrase, sauras-tu le retrouver?)

n°451963
urd-sama
waste of space
Posté le 09-07-2003 à 11:39:08  profilanswer
 

encore une mini question  :whistle:  
j'aimerais faire un bouton qui pops une fenetre avec exploration de fichier, pour que l'utilisateur puisse choisir un répertoire de base.
est-ce que je dois tout faire, ou il existe un objet tout fait? Car si je dois tout faire manuellement, l'utilisateur se débrouillera pour noter lui-même le chemin  :D

n°451966
drasche
Posté le 09-07-2003 à 11:48:17  profilanswer
 

Dans les composants, tu as un Microsoft Common Dialog, il cumule les fonctions Open/Save As/Color/Font/Print.  En ce qui concerne les Open/Save As, ça ne marche que sur les fichiers et non les répertoires; le reste, je n'ai jamais essayé.

n°452007
urd-sama
waste of space
Posté le 09-07-2003 à 12:25:22  profilanswer
 

vais regarder ca plus en détail alors merci  :jap:

n°453280
urd-sama
waste of space
Posté le 10-07-2003 à 09:40:18  profilanswer
 

encore une chtite question.
Lors de la création de l'arborescence de dossiers chez l'utilisateur, j'aimerais qu'il affichage à chaque fois "dossier créé" et fasse une pause (pour simuler la création "pas-à-pas" ).
 
jusqu'à présent, j'ai réussis à utiliser la fonction sleep, mais il attend le nombre de secondes totales, puis affiche tout d'un coup. D'ou peut provenir mon erreur?
 

Code :
  1. Private Sub Form_Load()
  2.   [...]
  3.   tabFolders = Array[...]
  4.   For Each sFolder In tabFolders
  5.     If (objFSO.FolderExists(sChemin & sFolder)) Then
  6.       sMsg = sMsg & "Folder already exists" & vbCrLf
  7.       lblGeneration.Caption = sMsg
  8.     Else
  9.       Set objFSO = objFSO.CreateFolder(sChemin & sFolder)
  10.     End If
  11.     Sleep 500
  12.   Next
  13.   sMsg = sMsg & vbCrLf & "Folders created"
  14.   lblGeneration.Caption = sMsg
  15. End Sub


note: pour le moment je n'ai traité que le cas ou le dossier existe déjà
 
 :jap:

n°453304
drasche
Posté le 10-07-2003 à 10:16:06  profilanswer
 

le problème du sleep c'est qu'il est pas documenté, donc non supporté (d'ailleurs il marche pas chez moi :cry:)
 
si t'es dans une form, je te suggère le contrôle Timer, qui va ticker toutes les x millisecondes (aussi longtemps que sa propriété Enabled vaut True).  A partir de là, tu peux gérer un compteur sur ton array pour créer tes directories.
 
Intéressant le coup du For Each, j'avais jamais essayé sur les arrays [:boidleau]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°453307
urd-sama
waste of space
Posté le 10-07-2003 à 10:18:10  profilanswer
 

okay  :jap:  
et puis en utilisant sleep ca risque de pas fonctionner sur toutes les machines je suppose? je vais regarder du coté du timer (j'avais déjà hésité).
 
le coup du for each c'est mes restes de perl  :ange:  
c'est pour ca que je tenais absolument à affecter mon tableau de string :D

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VB] Disposer les informations d'un fichier dans un tableau

 

Sujets relatifs
Fichier integré au projet[Perl] lecture/écriture d'un fichier
[OPENGL] Créer un fichier .raw [RESOLU]ouvrir une page d'un autre site dans une case de mon tableau
[PHP] Mettre un argument à un fichier en "include"[Perl] Effacer éléments du tableau
modifier la premier ligne d'un fichier txt en ASPPassage de tableau à une fonction
Tableau ou frame ?changer l'attribut taille d'un fichier ???
Plus de sujets relatifs à : [VB] Disposer les informations d'un fichier dans un tableau


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR