Pb EOF sur un fichier log [Résolu]

Signaler
Messages postés
5
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
15 octobre 2007
-
Messages postés
5
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
15 octobre 2007
-
Bonjour,

je dispose de fichier log d'une base de connaissances implémentée sur Sharepoint. Je fais des traitements sur ces fichiers afin d'en sortir des stats.
Je fais ces traitements (suppression de tout ce qui est inutile) grâce à une macro dans excel. celle ci fonctionne très bien mais lorsque mon fichier log dépasse les 65635 lignes, je ne peux plus lancer ma macro.

J'ai donc pensé à faire un tri directement sur le fichier grâce à une autre macro. J'élimine toutes les lignes inutiles (pleins de caratères divers) de mon fichier log et je copie tout ça dans un autre fichier. J'appliquerai alors mes traitements à ce 2eme fichier.

Mais ma macro ne lit pas tout le fichier et s'arrête avant la fin. Il doit détecter un EOF ou un truc dans le genre.
Voici mon code :


Sub tri()

Dim numFile1 As Long
Dim numFile2 As Long
Dim sTemp As String

numFile1 = FreeFile
Open "mon fichier de départ" For Input As #numFile1
numFile2 = FreeFile
Open "mon fichier d'arrivée" For Output As #numFile2
While Not EOF(numFile1)
Line Input #numFile1, sTemp
If InStr(1, sTemp, "F747E", 1) > 0 Then
Print #numFile2, sTemp
End If
Wend
Close #numFile2
Close #numFile1

End Sub


J'ai essayé en mode binary mais j'avoue que ça dépasse mes compétences.
Comment puis je faire pour récupérer toute mes lignes?

Merci.

8 réponses

Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008

Hello,

Si tu veux etre plus rapide, tu peux loader d'un bloc ton fichier texte en mode ça ira + vite :)

Exemple sur un fichier texte de 210 000 lignes : loadé en qques millisecondes, splitté en 1 seconde et rangé en 2 secondes :)

Sub zz()
    loadFileToTab "c:\fbsl_power.txt"
End Sub

Function loadFileToTab(szFile$)
Dim buffer$, vtBuff() As String, e, i&, j&, vtFinal() As Variant
    Open szFile For Binary As #1
        buffer = Space$(LOF(1))
        Get #1, , buffer
    Close #1
    '// Ou bien vbcr ou vblf ça depend du type de sep de ligne
    vtBuff = Split(buffer, vbLf)
    j = UBound(vtBuff)
   
    MsgBox j, , "Nb items :"
    ReDim Preserve vtFinal(j)
    For i = 0 To (j - 1)
        vtFinal(i) = Left(vtBuff(i), Len(vtBuff(i)) - 1)
    Next i
End Function

Bien sur ton taff se situera dans la partie For i = 0 To (j - 1)

Gérôme GUILLEMIN
Auteur du langage FBSL
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Salut
Ton programme est correct.
J'aurai simplement remplacé le While-Wend (obsolète) par un Do While-Loop.
J'aurai aussi utilisé vbTextCompare à la place du 1 final de ton Instr (plus lisible, mais ça ne change rien)
Un "Line Input" lit les lignes entières.
Tes lignes sont-elles bien terminées par des vbCrLf, c'est un dire un Chr(13) suivi d'un Chr(10) ?
Essaye de trouver la particularité de la chaine qu'il n'arrive pas à lire, à la fin.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
5
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
15 octobre 2007

Merci pour vos réponses.

@Jack : là est mon problème, je n'arrive à déterminer comment se finissent mes lignes. En fait je ne sais pas comment faire. Et en regardant la ligne où ça plante, je ne trouve pas de particularité. Mais sur un autre prog que j'avais fait, j'avais le droit à un "L'entréé dépasse la fin du fichier".

@Geddi : J'avoue que je ne comprends pas tout à ton prog. Je le comprends en gros. c'est à partir du redim que je suis perdu. Pourrais-je avoir quelques explications stp?
Je vais donc récupérer tous mes enregistrements en mémoire, est ce bien cela. Je n'aurai plus qu'à les remettre dans un fichier après la suppression des lignes en trop?


En tout cas merci
Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008

@Geddi : J'avoue que je ne comprends pas tout à ton prog. Je le
comprends en gros. c'est à partir du redim que je suis perdu.
Pourrais-je avoir quelques explications stp?

Je vais donc récupérer tous mes enregistrements en mémoire, est ce
bien cela. Je n'aurai plus qu'à les remettre dans un fichier après la
suppression des lignes en trop?

Wai, c'est bien ça, le redim va retailler une matrice en mémoire à la dimension de ce que tu as dans le fichier, en gros tu as une représentation sous forme de lignes.
vtFinal(i) : i = 'vtFinal' est un tableau à 1 dimension et 'i' est la ligne numéro 'i' de ton fichier texte, après quoi tu en fais ce que tu veux, suppression ou bien ajout de cette ligne de vtFinal(i) dans un autre fichier.
C'est que du concept basique là :)

Gérôme GUILLEMIN
Auteur du langage FBSL
Messages postés
5
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
15 octobre 2007

@Geddi : Ok c'est bien ce que j'avais compris.
Je vais tester tout ça. encore merci
je vous tiens au courant dès que j'ai avancé.

Merci
Messages postés
5
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
15 octobre 2007

@Geddi : Ok c'est bien ce que j'avais compris.
Je vais tester tout ça. encore merci
je vous tiens au courant dès que j'ai avancé.

Merci
Messages postés
206
Date d'inscription
lundi 22 novembre 1999
Statut
Membre
Dernière intervention
3 juillet 2008

Et ?

Gérôme GUILLEMIN
Auteur du langage FBSL
Messages postés
5
Date d'inscription
lundi 27 novembre 2006
Statut
Membre
Dernière intervention
15 octobre 2007

Ta solution fonctionne et je l'ai adaptée en fonction de ce que je voulais faire.
J'ai juste rencontré un problème avec vtFinal(i) = Left(vtBuff(i), Len(vtBuff(i)) - 1). Il y a une erreur d'exécution '5'.
Donc j'ai modifié cela et ça marche parfaitement.

Merci