cs_enock
Messages postés5Date d'inscriptionlundi 27 novembre 2006StatutMembreDernière intervention15 octobre 2007
-
11 oct. 2007 à 17:33
cs_enock
Messages postés5Date d'inscriptionlundi 27 novembre 2006StatutMembreDernière intervention15 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?
GEDDi
Messages postés206Date d'inscriptionlundi 22 novembre 1999StatutMembreDerniè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)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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)
cs_enock
Messages postés5Date d'inscriptionlundi 27 novembre 2006StatutMembreDernière intervention15 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?
GEDDi
Messages postés206Date d'inscriptionlundi 22 novembre 1999StatutMembreDerniè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à :)
cs_enock
Messages postés5Date d'inscriptionlundi 27 novembre 2006StatutMembreDernière intervention15 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.