Fichier texte - problème de boucle de remplissage

Résolu
phenrent76 Messages postés 13 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 3 mars 2005 - 14 févr. 2005 à 20:26
phenrent76 Messages postés 13 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 3 mars 2005 - 15 févr. 2005 à 22:44
Voilà mon code :
Dim FichierEntier As String
Dim Ligne As String
Dim Res3 As String
Dim Res4 As String


Res3 = Left(NameFich, Len(NameFich) - 4)
Res4 = Res3 & "-modif.txt"


Open NameFich For Input As #1
Do
Line Input #1, Ligne
FichierEntier = FichierEntier & Ligne
Loop Until EOF(1)
Close #1


chaine = RichTextBox2.Text
Tab1 = Element(chaine, 1, ";")
Tab2 = Element(chaine, 2, ";")
Tab3 = Element(chaine, 3, ";")
Tab4 = Element(chaine, 4, ";")
Tab5 = Element(chaine, 5, ";")
Tab6 = Tab4 & " - " & Tab2 & " - " & Tab3


'--voila c'est ici -- si vouz trouvez pour faire une boucle de remplissage - merci
Open Res4 For Output As #2
Print #2, Tab6
Close #2


MsgBox "Ecriture fichier terminée !"

Ce code fonctionne, j'arrive a extraire certaine partie de mon fichier séparé par un ";" puis à l'insérer dans un ordre différent dans un nouveau fichier, mais au remplissage je n'ai que la première ligne du texte de mon textbox, au lieu d'avoir toutes les lignes !. Quelqu'un peut t'il m'aider à finir .. je suis novice, et là je rame un peu.. merci

8 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
15 févr. 2005 à 16:11
Ok, je vois dans ce cas il y a plus simple :

Dim buf As String
Dim t() As String

' Si tu veux conserver l'affichage
Open nomfich For Input As #1
RichTextBox2 = Input(LOF(1), #1)
Close #1

' Pour recopier tout le fichier en le modifiant
Open nomfich For Input As #1
Open "Nouveau.txt" For Output As #2


Do While Not EOF(1)

Line Input #1, buf


t = Split(buf, ";")


Print #2, t(3) & " - " & t(1) & " - " & t(2)


Loop

Close #1
Close #2

Split est une fonction de VB et je crois que c'est mieux que la fonction Element et plus rapide.
A savoir, un tableau rempli avec un split commence toujours à 0, ainsi tes tab1 à tab5 deviennent t(0) à t(4).

' Pour rajouter l'année, insère ce bout de code dans la boucle de remplissage avant le print si tu veux l'écrire dans le nouveau fichier. Mais attention s'il y a du 01 et 02 pour 2004 aussi et ça, on ne peut pas le deviner.

If CInt(Right$(t(0), 2)) > Month(Date) Then
t(0) = t(0) & "2004"
Else
t(0) = t(0) & "2005"
End If


Si tu prog en VB6, ça devrait marcher, si c du VB.NET, il y aurait une modif à faire :
A la place de
If CInt(Right$(t(0), 2)) > Month(Date) Then
il faudrait coder
If CInt(Mid(t(0),Len(t(0))-2, 2)) > Month(Date) Then

Bonne prog

Loup Gris
3
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
14 févr. 2005 à 21:00
Salut, ton code doit être incomplet car je ne vois pas les relations entre FichierEntier, RichTextBox2.Text, Element, ....
D'autre part, à la place de :

Open NameFich For Input As #1
Do
Line Input #1, Ligne
FichierEntier = FichierEntier & Ligne
Loop Until EOF(1)
Close #1

tu peux coder :

Open NameFich For Input As #1
FichierEntier = Input(LOF(1), #1)
Close #1

Ca te permettrait de charger ton fichier texte en une seule fois.

Loup Gris
0
phenrent76 Messages postés 13 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 3 mars 2005
14 févr. 2005 à 22:20
Effectivement CanisLupus
a force de chercher, et en particulier par incrémentation ligne, mon code
était un peu encombré, le voici, mais as tu un tuyau pour mon problème ... cordialement

Open nomfich For Input As #1
RichTextBox2 = Input(LOF(1), #1)
Close #1


chaine = RichTextBox2.Text
Tab1 = Element(chaine, 1, ";")
Tab2 = Element(chaine, 2, ";")
Tab3 = Element(chaine, 3, ";")
Tab4 = Element(chaine, 4, ";")
Tab5 = Element(chaine, 5, ";")
Tab6 = Tab4 & " - " & Tab2 & " - " & Tab3


'--voila c'est ici
Open "Nouveau.txt" For Output As #2
Print #2, Tab6
Close #2

merci
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
15 févr. 2005 à 09:54
Je suppose que Element(....) est une fonction a toi pour découper la chaine ?
De toutes façons, tel que, ton code ne prend que les 5 premiers éléments (la 1ère ligne ?)
D'autre part, quelle est la structure de ton fichier ? Un tit exemple de quelques lignes ....

Loup Gris
0

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

Posez votre question
phenrent76 Messages postés 13 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 3 mars 2005
15 févr. 2005 à 13:30
Effectivement élément vient d'une fonction trouvée me semble t'il sur ce site la voici :

Public Function Element(ByVal Texte As String, _
ByVal Numero As Integer, _
ByVal Séparateur As String) As String

Dim Debut As Integer, r As Integer, No As Integer

If Right(Texte, Len(Séparateur)) <> Séparateur Then Texte = Texte & Séparateur

Debut = 1
No = 1
Element = ""


Element_0:
r = InStr(Debut, Texte, Séparateur)
If r = 0 Then GoTo Element_Fin
If Numero = No Then GoTo Element_10
No = No + 1
Debut = r + Len(Séparateur)
If r >= Len(Texte) Then GoTo Element_Fin
DoEvents
GoTo Element_0

Element_10:
Element = Mid(Texte, Debut, r - Debut)

Element_Fin:

End Function

concernant le fichier, voici quelques lignes

02/12;21:12:26;0126358859;75;STE DELAMNIE;PARIS;DURIEUX SERGE
02/12;21:12:27.0214685595;76;STE MALUITRE;HAUTOT;PHANNI PATRICIA
02/12;21:31:56;0423512566;34;STE DUPUIS;VENDARGUES;PANIS MAURICE
Etc

Le code n'extrait effectivement que 5 éléments du fichier, c'était juste pour étude, sachant que je veux exporter dans un nouveau fichier que quelques informations par ligne et pas dans le même ordre, que le contenu initial.
cordialement.
En plus, si jamais t'as une petite idée supplémentaire, la premiere colonne contient une information de adte, mais celle ci est incomplète, et après ce problème de lignes, je souhaiterais compléter ce champ avec une date complète style 00/00/2005, sachant que
certains fichiers peuvent contenir des données à cheval sur deux années, .... je me pose la question.
merci
0
phenrent76 Messages postés 13 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 3 mars 2005
15 févr. 2005 à 19:39
Merci pour tout Loup Gris
Rapide et efficace, ça fait vraiment plaisir .....
Tout marche nickel, et effectivement le split est beaucoup plus rapide.
Si je peux encore t'ennuyer deux secondes, peux tu me donner un peu plus d'expliq sur
If CInt(Right$(t(0), 2)) > Month(Date) Then
t(0) = t(0) & "2004"
Else
t(0) = t(0) & "2005"
End If
ca marche nickel, mais à quoi correspond le '2'
Encore un grand merci
cordialement -philippe
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
15 févr. 2005 à 20:14
Comme tes enregs commencent par "02/12", j'ai supposé que c'était du format "dd/mm".
Donc avec right$(t(0),2) j'extrais les 2 caractères de droite correspondant au mois. Si c'est du format anglais ("mm/dd") tu remplaces right$ par left$.
Ensuite, je convertis en integer pour comparer avec le mois en cours.
Si c'est > (de 3 à 12) on peut penser que c'est 2004, sinon c'est 2005.
Quoiqu'il faut se méfier si tu as des dates 02/02 par exemple qui devraient faire partie de 2004.

Loup Gris
0
phenrent76 Messages postés 13 Date d'inscription mardi 16 mars 2004 Statut Membre Dernière intervention 3 mars 2005
15 févr. 2005 à 22:44
Ok vu
merci pour tout
cordialement
0
Rejoignez-nous