Lire des mots d'un TXT spécial

Résolu
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005 - 23 déc. 2004 à 20:56
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005 - 9 juin 2005 à 15:26
Bonjour,

J'ai reçu ce code il y a plusieurs mois sur VBFrance... Maintenant que je suis près a l'utiliser je me rend compte que je n'arrive pas a bien le comprendre...

Ce code sert à afficher des mots contenues dans un fichier txt (c:\b.txt) et les transfèrer dans un label séparément...

Le fichier c:\b.txt est spécial... Chaque ligne contient plusieurs mots séparés par un signe(#).
Exemple :
mot1#mot2#mot3#mot4#mot5#""
mot6#mot7#mot8#mot9#mot10#""
etc...

Mes questions sont :

1 - Il y a t-il plus simple que ce code?

2 - Si non, comment je fais pour afficher le 3e mot de la 1e ligne? Et le 4e de la 1e ligne etc...? Ainsi que le 1er mot de la 2e ligne et le 2e de la 2e ligne? etc...
Parceque moi présentement avec ce code je ne peux qu'afficher les deux premiers mots de la 1e ligne... Pour les autres j'ai aucune idée de comment je pourrais les afficher...

3 - Pourquoi faut-il mettre un "" à la fin de chaque ligne? Est-ce obligatoire?

MERCI D'AVANCE!

----------------------------------------------------------------------------------
Dim Texte As String
Dim Numfile As Integer
Dim FirstHeader As Long
Dim NextHeader As Long

'Ouvre le fichier et le charge en mémoire vive
Numfile = FreeFile

Open "c:\b.txt" For Input As Numfile
Texte = Input(LOF(Numfile), Numfile)
Close Numfile

'Maintenant relevons les 2 premiers
'champs de chaque ligne

FirstHeader = InStr(1, Texte, "#")
'1er champs
LABEL1.Caption = Left$(Texte, FirstHeader - 1)
FirstHeader = FirstHeader + Len(",")

NextHeader = InStr(FirstHeader, Texte, "#")
'2eme champs
LABEL2.Caption = _
Mid$(Texte, FirstHeader, NextHeader - FirstHeader)

End Sub
--------------------------------------------------------------------------------------

15 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
24 déc. 2004 à 23:41
je comprends pas pourquoi ça te fait une erreur sur Mots(0) ???
j'ai modifier ma méthode, mais comme elle est basée sur le même principe que crenaud76, il faudrait trouver pourquoi cette erreur sur Mot(0)
pour l'utiliser:
lblNom = Table (1,1) '1ére Ligne, 1er Mot
lblCond = Table(2,3) '2éme Ligne, 3éme Mot
lblNum = Table(4,5) '4éme Ligne, 5éme Mot

Option Explicit

Option Base 0 

Dim Table()  As String

Private Sub Form_Load()
   Dim Texte As String
   Dim Lignes() As String
   Dim Mots()   As String 
   Dim i As Integer
   Dim j As Integer
   Dim x As Integer
   Dim y As Integer
    
    Open "c:\b.txt" For Binary As #1
       Texte = Space$(LOF(1))
       Get #1, , Texte
       Close #1
    Lignes = Split(Texte, vbCrLf)    x UBound(Lignes): y 1
    ReDim Table(x, y)
    For i = 0 To x - 1
        Mots = Split(Lignes(i), "#")
        If UBound(Mots) > y Then
           y = UBound(Mots)
           ReDim Preserve Table(x, y)
           End If
        For j = 0 To UBound(Mots) - 1
            Table(i + 1, j + 1) = Mots(j)
            Next
        Next
End Sub


Daniel
3
espadon2 Messages postés 71 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 21 octobre 2008
27 déc. 2004 à 16:58
Salut a tous ...voila une solution

les "" a la fin du ficheir ne serve a rien ici


Attention , il faut rajouter une reference au projet :"Microsoft Scripting Runtime"

Function GiveMots(aPathFile As String, aLine As Integer, aPos As Integer) As String
Dim fso As New FileSystemObject
Dim myTxt As TextStream ' le fichier text contenant les lignes de mots
Dim myLine As String ' la ligne
Dim myTabLine() As String ' le tableau resulat de la decoupe de la ligne


' ouverture du fichier texte passé en parametre
Set myTxt = fso.OpenTextFile(aPathFile, ForReading)

' on boucle jusque l'on arrive a la hauteur de la ligne
' on s 'arrete a la ligne precedente , cela explique aline - 1
For i = 1 To aLine - 1
' si on est arrivé a a la fin du fichier
If myTxt.AtEndOfStream = True Then
' il n' a pas autant de lignes ....
GiveMots = "!#ERROR#!"
Exit For

Else
myTxt.SkipLine
End If
Next i

If GiveMots = "" Then
' a ce niveau on est positionné sur la ligne recherher "aLine"
' On la recupere dans la variable myLine
myLine = myTxt.ReadLine

' on la decoupe en fonction #
myTabLine = Split(myLine, "#")

'A ce niveau on a recuperé un tableau contenant tous les mots de la ligne recherchées

' si la position existe ... aPos - 1 car le tableau commence a
' l 'indice zero ... Ubound = plus grand indice du tableau
If UBound(myTabLine) > aPos - 1 Then
' return du mots a la position demande ..
GiveMots = myTabLine(aPos - 1)
Else
' sinon il n' y as pas de mots a cette position
GiveMots = "!#ERROR#!"
End If
End If
End Function


Exemple utilsation :
Dim monMots As String
monMots = GiveMots(App.Path & "\b.txt",2, 4)
MsgBox monMots

=> Affichage de " mot10 "

Si ca peut aider des personnes ... salut bonnes fetes ...

espadon
3
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
23 déc. 2004 à 21:02
Oups, j'ai glissé une petite erreur dans le code... À la sixième ligne en partant de la fin vous voyez une virgule entre parenthèse... Et bien il s'agirait plutot de ("#") et non pas de (",")

J'attend vos réponses!!!
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
24 déc. 2004 à 00:22
Si je lit bien le code, seul les 2er mot de chaque ligne t'intéresse ?? On peut fair eun peu plus simple effectivement (et en plus içi il te manque une boucle pour tourner sur toutes les lignes du fichier.

Dim Texte As String, Numfile As Integer,Mots() as string,Lignes() as string,i as long

Numfile = FreeFile
Open "c:\b.txt" For Input As Numfile
Texte = Input(LOF(Numfile), Numfile)
Close Numfile
Lignes = split(text,vbcrlf) 'Eclate le fichier en ligne dans un tableau
For i = 0 to ubound(lignes) ' De la 1ere ligne à la dernière
mots = split(lignes(i),"#") ' Eclate la ligne en mots dans un tab
Msgbox Mots(0) ' 1er mot car tableau d'indice 0
Msgbox Motss(1) ' 2eme mot car tableau d'indice 0
Next

En remplacant bien sur les 2 appels à MsgBox par ce que tu veux faire des mots N°1 et N°2

Christophe R.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
24 déc. 2004 à 01:32
Merci de ta réponse...

Premièrement je ne veux pas que lire les deux premiers mots mais plutot tout les mots des toutes les lignes...

Je veux que chacuns des mots soient égalent au caption d'un label (un label par mot)...

J'ai donc essayé ta source et je me suis permis d'enlever le 2e 's' de l'avant dernière ligne ... Mais le code ne fonctionne pas plus...

Si je laisse les MsgBox rien ne se passe... Et si je les changent pour faire afficher dans un label cela ne fonctionne pas plus... Rien ne se passe!

J'espère que tu me répondra!

Merci d'avance
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
24 déc. 2004 à 03:13
si j'ai bien compris tu veux un mot par Label. Le mieux c'est de faire un groupe de contrôle, comme je sais pas combien il y aura de mots autant les créer dynamiquement au fur et à mesure, il faut donc que tu gardes le Label1 et que tu mettes sa propriété Index à 1, celui-ci servira de référence pour créer les autres.

Le "" à la fin de chaque Ligne n'est pas nécessaire, mais est-ce qu'il y a une vrai fin de Ligne (chr$(13) & chr$(10) ce qui expliquerait pourquoi le code de crenaud76 ne marchait pas.

La correction Len(",") en Len("#") n'était pas nécessaire, la Longueur d'un caractère sera toujours égale à 1.

Private Sub Command1_Click()
    Dim Texte As String
    Dim Lg    As Long
    Dim i     As Integer
    Dim x     As Integer
    Dim n     As Integer
    Dim posx  As Integer
    Dim posy  As Integer
    Dim dx    As Integer
    Dim dy    As Integer
    
' Lecture du Fichier
    Open "c:\b.txt" For Binary As #1         Lg LOF(1): Texte Space$(Lg)
         Get #1, , Texte
         Close #1
         
'   position de départ
    posx = Label1(1).Left
    posy = Label1(1).Top
'   définir l'intervalle entre 2 Labels    dx 100: dy 100
    
    For i = 1 To Lg
        x = InStr(i, Texte, "#")
        If x > 0 Then
           n = n + 1
           If n > 1 Then
'création d'un nouveau Label
              Load Label1(n)
              Label1(n).Left = posx
              Label1(n).Top = posy
              Label1(n).Visible = True
              End If
           posx = posx + Label1(1).Width + dx
' changement de Ligne tous les 5 Labels
           If n Mod 5 = 0 Then
              posx = Label1(1).Left
              posy = posy + Label1(1).Height + dy
              End If
           Label1(n) = Mid$(Texte, i, x - i)           If Mid$(Texte, x + 1, 2) Chr$(34) & Chr$(34) Then x x + 2           If Mid$(Texte, x + 1, 2) vbCrLf Then x x + 2
           i = x
           End If
        Next
        
End Sub


Daniel
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
24 déc. 2004 à 09:20
correction :
Dim Texte As String, Numfile As Integer,Mots() as string,Lignes() as string,i as long

Numfile = FreeFile
Open "c:\b.txt" For Input As Numfile
Texte = Input(LOF(Numfile), Numfile)
Close Numfile
Lignes = split(texte,vbcrlf) 'Eclate le fichier en ligne dans un tableau
For i = 0 to ubound(lignes) ' De la 1ere ligne à la dernière
mots = split(lignes(i),"#") ' Eclate la ligne en mots dans un tab
label1.caption =  Mots(0) ' 1er mot car tableau d'indice 0
label2.caption =  Mots(1) ' 2eme mot car tableau d'indice 0
label3.caption =  Mots(2) ' 3eme mot car tableau d'indice 0
label4.caption =  Mots(3) ' 4eme mot car tableau d'indice 0
' etc ... etc ...
Next


J'ai corrigé le 's' en trop et ajouté un 'e' à 'Texte' dans la ligne
"Lignes = split(texte,vbcrlf)"
Au passage, pour éviter ce genre de désagrément, je te conseille de rajouter "Option Explicit" tout en haut de tous tes modules, cela évitera qu'une erreur de frappe ne bogue ton code ...

Christophe R.
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
24 déc. 2004 à 22:12
Bonjour,

Merci de vos réponses crenaud76 et Gobillot!

Gobillot :
Je n'ai pas testé ton code Gobillot... Il semble excellent mais le problème c'est que tous mes label portent des nom différends (lblNom,lblCond,lblNum,lblYe,etc...) et je tiens a garder ces noms (J'en ai BeAuCouP!) Il y a-t-il un autre moyen me permettant de garder mes noms de labels???????????

crenaud76 :
J'ai testé ton code... Étrangement il ne fonctionne toujours pas. Maintenant je ne suis capable d'ouvrir le programme...
Cette erreur survient :
Erreur d'exécution 9
Indice en dehors de la plage
Et là il surligne en jaune :
lblNum.Caption = Mots(0) ' 1er mot car tableau d'indice 0

J'attend vos réponses....!!! :0)

Merci d'avance
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
25 déc. 2004 à 22:25
T'aurais pas un "Option Base 1" en haut de ton module ??
Si oui, il faut incrémenter d'un les indices des mots. Mots(0) deviendra Mots(1) pour le 1er mot, Mots(1) deviendra Mots(2) pour le 2eme mot, etc ....
Ou alors tu laisses les indices tel quel et tu supprimes le "Option Base 1" (ou tu mets "Option Base 0", mais c'est la valeur par défaut, donc ...)

Christophe R.
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
27 déc. 2004 à 20:02
Rebonjour,

Les deux 'Réponses Acceptées' marchent TRÈS BIEN!

MERCI À TOUS!...

Mais j'ai une autre question à propos de ces codes qui méritait d'être posée dans une nouveau topic...

Allez la lire ici:
http://www.vbfrance.com/forum.v2.aspx?ID=359121&post=ok

Merci.....
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
29 déc. 2004 à 00:27
Rebonjour,

J'ai une question à posée à Gobillot, si possible...
C'est à propos de son code...

Comment dois-je faire pour effectuer une action de ce genre:

If txtTest.text = (n'importe quel 1ER mot de n'importe quelle lignes) then
...
...
...
End If

Tout ca À PARTIR du code ci-haut de Gobillot

Merci d'avance
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
29 déc. 2004 à 00:50
tu veux tester le premier mot de chaque Ligne:

For i = 1 To UBound(Table, 1)
If txtTest.text = Table(i, 1) then
MsgBox "trouvé en " & i & "eme ligne"
Exit For
End If
Next

sinon pour toutes les lignes et tous les mots il faut 2 boucles:

For j = 1 To UBound(Table, 2)
For i = 1 To UBound(Table, 1)
If txtTest.text = Table(i, j) Then
MsgBox "trouvé en " & i & "eme ligne " & j & "eme mot"
Exit For
End If
Next
Next

Daniel
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
8 juin 2005 à 16:08
Bonjour,



Après 6 mois, j'ai une question pour vous...



Est-il possible de faire une méthode d'écriture dans le même genre (sûrement que oui!)?



J'avoue que même si les deux sources acceptée fonctionnent très bien,
j'ai utilisé celle de Espadon2 simplement parcequ'il était plus facile
d'utiliser plusieurs fichiers .txt différends...



Donc je voudrais quelque chose qui ressemblerait à ça:



GiveMots(App.Path & "\b.txt",2, 4)



Mais pour l'écriture...



Je veux simplement ,par exemple, remplacer une valeur existance à (2,4) pour en mettre une autre...





Merci d'avance!
0
espadon2 Messages postés 71 Date d'inscription jeudi 19 juin 2003 Statut Membre Dernière intervention 21 octobre 2008
8 juin 2005 à 16:39
Salut ,


Ben c 'est plus ou moins le meme code ..


exp :


mais tu dois te créer un fichier temp, copie de ton fichier avant
fso.CopyFile (aPathFile,app.path & "\temp.txt",True)

c 'est le fichier temp que tu dois lire,
tu ouvre donc ce fichier en lecture ... (ForReading),
et aPathFile en ecriture (ForWriting)
tu parcours le temp avec la meme méthode , et a chaque ligne tu réécris la ligne dans ton fichier aPathFile
Arrive a la bonne ligne , tu remplace le contenu du tableau (MyTabline) a la bonne position par ton nouveau mot (a Passé en paramètres)
Tu récrée une nouvelle ligne (chaine), avec le contenu de ton tableau en le parcourant , et tu l' ecrit dans ton fichier pathFile
Puis tu continue jusqu' a la fin de ton fichier temp, en ecrivant chaque ligne de ce derneir dans le fichier pathfile

Pas le temps de faire le code + tester, mais le principe est là

A toi de jouer
A+

espadon
0
danielgrd Messages postés 47 Date d'inscription mercredi 15 janvier 2003 Statut Membre Dernière intervention 22 juin 2005
9 juin 2005 à 15:26
Bonjour,



Merci de votre réponse...



Par contre, n'étant vraiment pas très doué a construire mes propre
codes, même avec tout vos étapes je ne crois pas être capable. Je vais
devoir demander de l'aide à quelqun pour le faire... Donc j'ai créé un
nouveau topic ramenant ici...



Le voici : http://www.vbfrance.com/forum.v2.aspx?ID=480833



Merci encore!
0
Rejoignez-nous