OVH Cloud OVH Cloud

Fichier texte ?

3 réponses
Avatar
Jean Naimard
Bonjour,

Je désirerais extraire les X dernieres lignes d'un fichier texte.
J'y arrive sans probleme en balayant le fichier du debut a la fin pour
savoir combien le fichier possede de lignes mais je trouve que ce n'est pas
génial.
Connaissez vous un autre moyen ?
Merci

3 réponses

Avatar
Zoury
Bonjour Jean ! :O)

Si ton fichier n'est pas trop gros, tu peux le lire en entier d'un seul coup
et effectuer un Split() sur le retour de chariot afin de déterminer
rapidement le nombre de ligne total en plus de permettre de retourner
rapidement les X dernière lignes souhaitées.

Ex :
'***
Option Explicit

Private Sub Form_Load()

Debug.Print GetLastLines("c:file2.txt", 3)

End Sub

Private Function GetLastLines(ByVal FileName As String, ByVal LineCount As
Long) As String

Dim hFile As Long
Dim sContent As String
Dim sLines() As String
Dim nUBound As Long
Dim i As Long

' lit le contenu du fichier
hFile = FreeFile
Open FileName For Binary As #hFile
sContent = Space$(LOF(hFile))
Get #hFile, , sContent
Close #hFile

' retourne les dernières lignes
sLines = Split(sContent, vbNewLine)
nUBound = UBound(sLines)
For i = nUBound - LineCount + 1 To nUBound
GetLastLines = GetLastLines & sLines(i) & vbNewLine
Next i

End Function
'***

Tu peux également employer ma classe CFile pour effectuer cette tâche :
'***
Option Explicit

Private Sub Form_Load()

Debug.Print GetLastLines("c:file2.txt", 3)

End Sub

Private Function GetLastLines(ByVal FileName As String, ByVal LineCount As
Long) As String

Dim f As CFile ' fichier à lire
Dim f2 As CFile ' sert de StringBuilder...
Dim i As Long

Set f = New CFile
Set f2 = New CFile

' ouvre le fichier
Call f.OpenFile(FileName)

' obtient les dernière lignes
For i = f.LineCount - LineCount + 1 To f.LineCount
Call f2.AppendLine(f.Lines(i))
Next i

GetLastLines = f2.Text

End Function
'***

Voir ici pour ma classe :
http://groups.google.com/groups?selm=%235a%244WKVFHA.616%40TK2MSFTNGP12.phx.gbl

--
Cordialement
Yanick
MVP pour Visual Basic

"Jean Naimard" a écrit dans le message de
news:dbgkan$f39$
Bonjour,

Je désirerais extraire les X dernieres lignes d'un fichier texte.
J'y arrive sans probleme en balayant le fichier du debut a la fin pour
savoir combien le fichier possede de lignes mais je trouve que ce n'est


pas
génial.
Connaissez vous un autre moyen ?
Merci




Avatar
Fred
Dans son message dbgkan$f39$
Jean Naimard nous dit :

Bonjour,

Je désirerais extraire les X dernieres lignes d'un fichier texte.
J'y arrive sans probleme en balayant le fichier du debut a la fin pour
savoir combien le fichier possede de lignes mais je trouve que ce
n'est pas génial.
Connaissez vous un autre moyen ?
Merci



Bonsoir,
C'est l'occasion de ressortir ce bon vieux buffer FIFO (first in first
out).

Dim fifo(X-1) As String
Dim idx As Integer
idx=0
.....
While Not EOF(fichier)
Line Input fichier, fifo(idx)
If idx=X-1 Then idx=0 Else idx=idx+1
Wend
....

Voilà, en sortie de boucle (ma syntaxe est peut-être un peu défaillante
comme ma mémoire), le tableau fifo contient les X dernières lignes du
fichier. Et ceci en une seule passe avec un minimum d'occupation
mémoire.
Si l'ordre des lignes a une importance alors :
La première de ces X dernières lignes est à la position idx
La seconde à la position idx+1 (ou 0 si idx=X-1)
...
La dernière est à la position idx-1 (ou X-1 si idx=0)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Jean Naimard
Merci pour ces infos
Je vais essayer ça demain !!

"Fred" a écrit dans le message de news:
#
Dans son message dbgkan$f39$
Jean Naimard nous dit :

> Bonjour,
>
> Je désirerais extraire les X dernieres lignes d'un fichier texte.
> J'y arrive sans probleme en balayant le fichier du debut a la fin pour
> savoir combien le fichier possede de lignes mais je trouve que ce
> n'est pas génial.
> Connaissez vous un autre moyen ?
> Merci

Bonsoir,
C'est l'occasion de ressortir ce bon vieux buffer FIFO (first in first
out).

Dim fifo(X-1) As String
Dim idx As Integer
idx=0
.....
While Not EOF(fichier)
Line Input fichier, fifo(idx)
If idx=X-1 Then idx=0 Else idx=idx+1
Wend
....

Voilà, en sortie de boucle (ma syntaxe est peut-être un peu défaillante
comme ma mémoire), le tableau fifo contient les X dernières lignes du
fichier. Et ceci en une seule passe avec un minimum d'occupation
mémoire.
Si l'ordre des lignes a une importance alors :
La première de ces X dernières lignes est à la position idx
La seconde à la position idx+1 (ou 0 si idx=X-1)
...
La dernière est à la position idx-1 (ou X-1 si idx=0)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT