Pb EOF sur un fichier log

Résolu
cs_enock Messages postés 5 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 15 octobre 2007 - 11 oct. 2007 à 17:33
cs_enock Messages postés 5 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 15 octobre 2007 - 15 oct. 2007 à 14:47
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

GEDDi Messages postés 206 Date d'inscription lundi 22 novembre 1999 Statut Membre Dernière intervention 3 juillet 2008
11 oct. 2007 à 21:40
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
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
11 oct. 2007 à 19:59
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)
0
cs_enock Messages postés 5 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 15 octobre 2007
12 oct. 2007 à 10:00
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
0
GEDDi Messages postés 206 Date d'inscription lundi 22 novembre 1999 Statut Membre Dernière intervention 3 juillet 2008
12 oct. 2007 à 11:22
@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
0

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

Posez votre question
cs_enock Messages postés 5 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 15 octobre 2007
12 oct. 2007 à 16:01
@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
0
cs_enock Messages postés 5 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 15 octobre 2007
12 oct. 2007 à 16:01
@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
0
GEDDi Messages postés 206 Date d'inscription lundi 22 novembre 1999 Statut Membre Dernière intervention 3 juillet 2008
14 oct. 2007 à 22:15
Et ?

Gérôme GUILLEMIN
Auteur du langage FBSL
0
cs_enock Messages postés 5 Date d'inscription lundi 27 novembre 2006 Statut Membre Dernière intervention 15 octobre 2007
15 oct. 2007 à 14:47
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
0
Rejoignez-nous