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

Disposer les informations d'un fichier dans un tableau [VB] - VB/VBA/VBS - Programmation

Marsh Posté le 08-07-2003 à 10:19:53    

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
Reply

Marsh Posté le 08-07-2003 à 10:19:53   

Reply

Marsh Posté le 08-07-2003 à 10:22:49    

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)
Reply

Marsh Posté le 08-07-2003 à 10:26:40    

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
Reply

Marsh Posté le 08-07-2003 à 10:45:30    

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)
Reply

Marsh Posté le 08-07-2003 à 10:46:37    

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)
Reply

Marsh Posté le 08-07-2003 à 10:51:00    

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?

Reply

Marsh Posté le 08-07-2003 à 11:20:38    

: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)
Reply

Marsh Posté le 08-07-2003 à 11:22:49    

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]

Reply

Marsh Posté le 08-07-2003 à 11:30:03    

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)
Reply

Marsh Posté le 08-07-2003 à 13:19:22    

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?

Reply

Marsh Posté le 08-07-2003 à 13:19:22   

Reply

Marsh Posté le 08-07-2003 à 13:30:13    

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)
Reply

Marsh Posté le 08-07-2003 à 14:01:40    

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 :/

Reply

Marsh Posté le 08-07-2003 à 14:11:59    

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)
Reply

Marsh Posté le 08-07-2003 à 14:16:37    

drasche a écrit :

Remarques sur mon code:
[...]


je ne peux que m'incliner  :jap:

Reply

Marsh Posté le 08-07-2003 à 15:17:48    

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

Reply

Marsh Posté le 08-07-2003 à 15:22:50    

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)
Reply

Marsh Posté le 08-07-2003 à 15:24:44    

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

Reply

Marsh Posté le 08-07-2003 à 15:26:42    

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)
Reply

Marsh Posté le 08-07-2003 à 15:31:19    

Reply

Marsh Posté le 08-07-2003 à 15:36:06    


?


---------------
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)
Reply

Marsh Posté le 08-07-2003 à 15:49:35    

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

Reply

Marsh Posté le 09-07-2003 à 07:50:03    

à 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  :(

Reply

Marsh Posté le 09-07-2003 à 08:42:37    

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)
Reply

Marsh Posté le 09-07-2003 à 08:48:33    

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

Reply

Marsh Posté le 09-07-2003 à 08:53:35    

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)
Reply

Marsh Posté le 09-07-2003 à 09:24:08    

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

Reply

Marsh Posté le 09-07-2003 à 11:09:44    

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

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


 

Reply

Marsh Posté le 09-07-2003 à 11:10:38    

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

Reply

Marsh Posté le 09-07-2003 à 11:11:23    

drasche a écrit :

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


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

Reply

Marsh Posté le 09-07-2003 à 11:15:26    

Urd-sama a écrit :

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


aaaah ok moi avais pas compris  :pt1cable:

Reply

Marsh Posté le 09-07-2003 à 11:20:37    

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

Reply

Marsh Posté le 09-07-2003 à 11:24:40    

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

Reply

Marsh Posté le 09-07-2003 à 11:39:08    

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

Reply

Marsh Posté le 09-07-2003 à 11:48:17    

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é.

Reply

Marsh Posté le 09-07-2003 à 12:25:22    

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

Reply

Marsh Posté le 10-07-2003 à 09:40:18    

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:

Reply

Marsh Posté le 10-07-2003 à 10:16:06    

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)
Reply

Marsh Posté le 10-07-2003 à 10:18:10    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed