anthonyj
Messages postés11Date d'inscriptionjeudi 6 novembre 2008StatutMembreDernière intervention24 décembre 2008
-
19 déc. 2008 à 09:01
anthonyj
Messages postés11Date d'inscriptionjeudi 6 novembre 2008StatutMembreDernière intervention24 décembre 2008
-
24 déc. 2008 à 11:18
Bonjour
Je suis en train de créer un petit code sur excel pour aller chercher un mot dans un fichier txt.
Explications:
Je souhaiterai mettre dans une cellule (A2) le mot que je recherche puis appuyer sur un bouton et lancer cette recherche.
La recherche ce fait dans un fichier texte ou il y a des caractères spéciaux.
Le probleme est que ce fichier en question comporte dans ligne très longue et certain caractéres qui me fond stopper mon programme avant d'arriver a la fin du fichier.
anthonyj
Messages postés11Date d'inscriptionjeudi 6 novembre 2008StatutMembreDernière intervention24 décembre 2008 19 déc. 2008 à 09:02
Voici le code
Sub Fichiertxt()
'Declaration des variables
Dim F1, NbreTag As Integer
Dim sourcefile As String 'variables pour fichier original et fichier de copie
Dim SearchText As String, ReplaceText As String 'variables pour remplacer le texte
Dim p As Variant
Dim a As Variant
Dim TextLigne
Dim PosDebut As String
sourcefile = Worksheets(1).Range("E3").Value + Worksheets(1).Range("E4").Value
F1 = FreeFile
Open sourcefile For Binary Access Read Write As #1
Do Until a = 1000
On Error GoTo fin
numligne = 2
TextLigne = ""
Line Input #1, TextLigne 'Lecture de la ligne courante dans fichier original
SearchText = Worksheets(1).Cells(2, 1).Value
Worksheets(1).Cells(2, 2).Value = TextLigne
p = InStr(p + 1, UCase(TextLigne), UCase(SearchText))
If (p > 0) Then NbreTag = NbreTag + 1
a = a + 1
fin:
PosDebut = Seek(1)
Seek 1, PosDebut - 1
Print #1, Chr(13)
Loop
Close #1
MsgBox NbreTag & "," & a & "," & PosDebut
End Sub
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 19 déc. 2008 à 11:09
Bonjour
Normalement dans un fichier texte il n'y a pas tant de caractères spéciaux .
Je veux dire aucun caractère binaire de fin de fichier par exemple sinon le fichier est un faux fichier texte donc apparenté à un fichier binaire.
Il me semble que tu dois avoir des doutes.Puisque tu ouvres le fichier en mode Binary. Qui plus est, je ne comprend pas pourquoi avec un Access Write avec une commande print 13 pour ajouter un saut de ligne.
Pour verifier le fichier utilise un editeur hexadécimal exemple : Notepad++.
Notepad++ au passage compte le nombre d'occurence trouvé dans un fichier dans la fenetre Rechercher/Remplacer : pratique non.
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 19 déc. 2008 à 12:10
J'oubliais
Line Input c'est pour lire dans un fichier texte ligne par ligne
Mais ici il faut déclarer un buffer de caractere et utiliser la commande get
anthonyj
Messages postés11Date d'inscriptionjeudi 6 novembre 2008StatutMembreDernière intervention24 décembre 2008 19 déc. 2008 à 15:43
C'est pas mieux avec instrb, il fait bien la boucle mais il trouve pas la chaine caractère.
Pour info le print c'était pour un test.
Voici le nouveau code:
'Faire un search and replace d'un texte dans un fichier
Sub Fichiertxt()
'Declaration des variables
Dim F1, NbreTag As Integer
Dim sourcefile As String 'variables pour fichier original et fichier de copie
Dim SearchText As String, ReplaceText As String 'variables pour remplacer le texte
Dim p As Variant
Dim a As Variant
Dim TextLigne
Dim PosDebut As String
sourcefile = Worksheets(1).Range("E3").Value + Worksheets(1).Range("E4").Value
F1 = FreeFile
Open sourcefile For Binary Access Read Write As #1
Do Until a = 1000
On Error GoTo fin
numligne = 2
TextLigne = ""
Line Input #1, TextLigne 'Lecture de la ligne courante dans fichier original
SearchText = Worksheets(1).Cells(2, 1).Value
Worksheets(1).Cells(2, 2).Value = TextLigne
p = InStrB(p + 1, UCase(TextLigne), UCase(SearchText), vbBinaryCompare)
If (p > 0) Then NbreTag = NbreTag + 1
a = a + 1
fin:
PosDebut = Seek(1)
Seek 1, PosDebut - 1
Loop
Close #1
MsgBox NbreTag & "," & a & "," & PosDebut
End Sub
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 19 déc. 2008 à 19:19
Bonjour
Comme l'a déjà fait remarquer loulou69 :
Line Input lit un fichier séquentiel, donc ouvert en lecture séquentielle (Open ... For Input)
Pour lire et écrire un fichier en binaire (Open ... For Binary), tu dois :
- déclarer un buffer (Dim buffer As String * 50, par exemple)
- lire le fichier par l'instruction Get (Get #1, maPosition, buffer, par exemple)
- ecrire par l'instruction Put (Put #1, maPosition, buffer, par exemple)
Ton problème actuel , c'est que tu ouvres le fichier en Binaire et tu le lis en séquentiel.
anthonyj
Messages postés11Date d'inscriptionjeudi 6 novembre 2008StatutMembreDernière intervention24 décembre 2008 22 déc. 2008 à 11:27
Ok, mais comment je place cette instruction GET/PUT??
Je l'ai mis après l'ouverture du fichier mais il bloque..
Sub Fichiertxt()
'Declaration des variables
Dim F1, NbreTag As Integer
Dim sourcefile As String
Dim SearchText As String, ReplaceText As String
Dim p As Variant
Dim a As Variant
Dim TextLigne
Dim PosDebut As String
Dim buffer As String * 1000
Dim maPosition
sourcefile = Worksheets(1).Range("E3").Value + Worksheets(1).Range("E4").Value
F1 = FreeFile
Open sourcefile For Binary Access Read Write As #1
Get #1, maPosition, buffer
Do Until a = 1000
On Error GoTo fin
numligne = 2
TextLigne = ""
SearchText = Worksheets(1).Cells(2, 1).Value
Worksheets(1).Cells(2, 2).Value = TextLigne
p = InStrB(p + 1, UCase(TextLigne), UCase(SearchText), vbBinaryCompare)
If (p > 0) Then NbreTag = NbreTag + 1
a = a + 1
fin:
PosDebut = Seek(1)
Put #1, maPosition, buffer
Loop
Close #1
MsgBox NbreTag & "," & a & "," & PosDebut
End Sub
Merci encore
[javascript:Insert_Emoticon('/imgs2/smile.gif'); ]
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 22 déc. 2008 à 20:59
Salut
- si tu préfères utiliser #1 plutôt que F1 comme numéro de fichier, enlève toute référence à F1
- l'instruction Get ne doit pas se trouver hors de la boucle mais dans la boucle :
Do Until a = 1000
...
Get
Loop
- la variable maPosition est un pointeur de fichier et ne peut pas être nul, car le 1er octet du fichier est à la position 1
- tu dois gérer maPosition pour indiquer
- je ne vois pas à quoi te servent les variables replaceText, TextLigne, posDebut
Bon, voici deux exemples :
a) si ton fichier est un fichier texte séquentiel, tu dois l'ouvrir en Input et écrire un fichier temporaire, puis renommer les fichiers :
<hr />
Sub fichierSequentiel()
Dim F1 As Integer
Dim F2 As Integer
Dim sourceFile As String
Dim destFile As String
Dim buffer As String
Dim chaineCherchee As String
Dim chaineSubstitution As String
F1 = FreeFile
F2 = FreeFile
destFile = sourceFile & ".tmp"
Open sourceFile For Input As #F1
Open destFile For Output As #F2
Do Until EOF(F1)
Line Input #F1, buffer
buffer = Replace(buffer, chaineCherchee, chaineSubstitution)
Print #F2, buffer
Loop
Close F1
Close F2
Name sourceFile As sourceFile & ".sav"
Name destFile As sourceFile
End Sub
b) si ton fichier est binaire et n'est pas gigantesque, le mieux, c'est encore de le charger dans une variable
<hr />
Sub fichierSequentiel()
Dim F1 As Integer
Dim sourceFile As String
Dim buffer As String
Dim chaineCherchee As String
Dim chaineSubstitution As String
F1 = FreeFile
Open sourceFile For Binary As F1
buffer = Space(LOF(F1))
Get #F1, 1, buffer
buffer = Replace(buffer, chaineCherchee, chaineSubstitution)
Put #F1, 1, buffer
Close F1
End Sub
<hr />
Ce ne sont que des exemples, tu dois initialiser les variables sourceFile, chaineCherchee, chaineSubstitution.
anthonyj
Messages postés11Date d'inscriptionjeudi 6 novembre 2008StatutMembreDernière intervention24 décembre 2008 23 déc. 2008 à 13:25
Avec ce nouveau code ce n'est pas mieux. J'ai l'impression que mon fichier txt est inexploitable??
Car quand je mets des caractères dit normaux (A,B,C,D....) la sa fonctionne. Mais avec les caractères spéciaux sa ne fonctionne pas????
Nouveau code.
Sub fichierSequentiel()
Dim F1 As Integer
Dim F2 As Integer
Dim sourceFile As String
Dim destFile As String
Dim buffer As String
Dim chaineCherchee As String
Dim chaineSubstitution As String
sourceFile = Worksheets(1).Range("E3").Value + Worksheets(1).Range("E4").Value
destFile = Worksheets(1).Range("E3").Value + "copy of " + Worksheets(1).Range("E4").Value
F1 = FreeFile
Open sourceFile For Input As #F1
F2 = FreeFile
destFile = sourceFile & ".txt"
Open destFile For Output As #F2
chaineCherchee = "CC"
chaineSubstitution = "CC"
Do Until EOF(F1)
Line Input #F1, buffer
buffer = Replace(buffer, chaineCherchee, chaineSubstitution)
If buffer = chaineCherchee Then
MsgBox ("ok")
End If
Print #F2, buffer
Loop
Close F1
Close F2
Name sourceFile As sourceFile & ".sav"
Name destFile As sourceFile
End Sub
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 23 déc. 2008 à 18:07
Désolé, je ne peux rien faire de plus pour te dépanner.
Le mieux, si ton fichier est vraiment un fichier texte, c'est de l'ouvrir avec le bloc-note et d'utiliser le menu édition/remplacer pour faire les substitutions.
Mais à mon avis, soit ce n'est pas un vrai fichier texte (comme loulou69 l'avait supposé dès le 19 décembre), soit il est définitivement endommagé.
anthonyj
Messages postés11Date d'inscriptionjeudi 6 novembre 2008StatutMembreDernière intervention24 décembre 2008 24 déc. 2008 à 09:12
Quand je lance la macro avec un fichier .txt dit normal ou dedans il y des lettres A,B,C,D,E,F....Et que je cherche par exemple la lettre C, la macro fonctionne et trouve ce que je lui demande.
Par contre quand je fais ce même test avec mon fichier .txt, la sa ne fonctionne pas.
J'aimerai vous joindre mon fichier txt d'origine pour que vous puissiez le visualiser mais pouvez vous me dire comment je peux faire pour vous joindre un fichier volumineux (en longueur)????
Merci
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 24 déc. 2008 à 09:22
Si on regarde bien ton fichier, c'est un fichier clairement binaire qui à un lien avec la fabrication de programme (compilation, objet, exécutable, ...), il s'agit d'une sorte de fichier de projet qui liste les fichiers à lier, qu'est ce que Delta: cela te dis quelque chose?
anthonyj
Messages postés11Date d'inscriptionjeudi 6 novembre 2008StatutMembreDernière intervention24 décembre 2008 24 déc. 2008 à 10:05
Oui c'est un fichier extrait d'un synoptique (dessin industriel) fait sous un superviseur DELTAV. Et dans ce fichier je souhaiterai savoir si un tag X (par exemple TC6331) est présent dans le synoptique via une macro
cs_loulou69
Messages postés672Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention 2 juin 20161 24 déc. 2008 à 11:04
Maintenant que l'on connait l'origine du fichier, on n'est pas plus avancé pour te dire qu'il s'agit d'un fichier binaire dans lequel se glisse des morceaux de texte. Par endroit, les caractères sont codés sur 1 caractère à d'autres sur 2 caractères.
"Line input" arrete la lecture au premier caractère spécial empechant de trouver les chaines recherchées