OVH Cloud OVH Cloud

Classe CFile

23 réponses
Avatar
F. David
Bonjour,

Pour les besoins d'une petite application personnelle, j'aurais besoin
de supprimer une ligne dans un fichier texte lorsque cette ligne
contient le mot "blabla".
J'ai jeté un coup d'oeil dans les archives et j'ai trouvé une classe
CFile (de Yanick Lefebvre) qui permet de faire ça.

Ca marche bien sauf que ca me rajoute des lignes supplémentaires à la
fin du fichier texte.
Est-ce que quelqu'un aurait une idée. Voici mon code :

Dim f As CFile
Dim i As Long
Dim s As String
Set f = New CFile

f.ReadFile "c:\test.txt"

For i = 0 To f.LineCount
s = f.Lines(i)
If Left(s, 6) = "blabla" Then
s = ""
f.SetLine i, s
End If
Next i
f.SaveFile

Je me trompe peut-être quelque part mais où ?

Merci de votre aide

Franck

10 réponses

1 2 3
Avatar
Bismark Prods
Pourquoi tu ne retouche pas la classe CFile pour y adjoindre une méthode
Replace ? Ainsi tu pourrais remplacer blabla par rien ! et ca serait plus
simple et sans doute plus clair.


"F. David" a écrit dans le message de
news:
Bonjour,

Pour les besoins d'une petite application personnelle, j'aurais besoin
de supprimer une ligne dans un fichier texte lorsque cette ligne
contient le mot "blabla".
J'ai jeté un coup d'oeil dans les archives et j'ai trouvé une classe
CFile (de Yanick Lefebvre) qui permet de faire ça.

Ca marche bien sauf que ca me rajoute des lignes supplémentaires à la
fin du fichier texte.
Est-ce que quelqu'un aurait une idée. Voici mon code :

Dim f As CFile
Dim i As Long
Dim s As String
Set f = New CFile

f.ReadFile "c:test.txt"

For i = 0 To f.LineCount
s = f.Lines(i)
If Left(s, 6) = "blabla" Then
s = ""
f.SetLine i, s
End If
Next i
f.SaveFile

Je me trompe peut-être quelque part mais où ?

Merci de votre aide

Franck




Avatar
Zoury
Salut Franck! :O)

Tu n'aura pas le choix de refaire un fichier en y excluant la ligne que tu
veux supprimer.
http://groups.google.com/groups?threadm=OiREKllUDHA.2204%40TK2MSFTNGP10.phx.gbl

Car si tu lit un peu de le code de la classe, tu verras que j'utilise un
Join() avec vbNewLine sur le tableau de String() afin de recréer le texte.
Hors si un item est vide, tu auras tout de meme un saut de ligne qui le
suivra.

Exemple :
'***
Dim s(2) As String

s(0) = "Salut!"
s(2) = "Hehe!"

Debug.Print Join(s, vbNewLine)
'***

Le résultat est le suivant :
Salut!

Hehe!

Le code de la classe à évolué depuis, voici une discussion t'offrant la
version la plus récente :
http://groups.google.com/groups?threadm=ururJ7iqDHA.2588%40tk2msftngp13.phx.gbl

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
Zoury
Salut Simon! :O)

La dernière version de CFile comprend une fonction ReplaceText.. le problème
est toutefois le même que celui mentionné dans mon autre message, on se
retrouve avec 2 vbNewLine de suite.. on peut toutefois résoudre ce problème
de cette façon :

text.txt :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 5
ligne 6
ligne 7
ligne 8
ligne 9

'***
Option Explicit

Private Sub Form_Load()
Dim f As CFile
Dim i As Long

Set f = New CFile
Call f.OpenFile("c:test.txt")

Call f.ReplaceText("ligne 5" & vbNewLine, "")
Debug.Print f.Text

End Sub
'***

Résultat :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

Et je crois que c'est plus rapide que la solution mentionnée dans mon
message précédent.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"Bismark Prods" wrote in message
news:
Pourquoi tu ne retouche pas la classe CFile pour y adjoindre une méthode
Replace ? Ainsi tu pourrais remplacer blabla par rien ! et ca serait plus
simple et sans doute plus clair.


"F. David" a écrit dans le message de
news:
> Bonjour,
>
> Pour les besoins d'une petite application personnelle, j'aurais besoin
> de supprimer une ligne dans un fichier texte lorsque cette ligne
> contient le mot "blabla".
> J'ai jeté un coup d'oeil dans les archives et j'ai trouvé une classe
> CFile (de Yanick Lefebvre) qui permet de faire ça.
>
> Ca marche bien sauf que ca me rajoute des lignes supplémentaires à la
> fin du fichier texte.
> Est-ce que quelqu'un aurait une idée. Voici mon code :
>
> Dim f As CFile
> Dim i As Long
> Dim s As String
> Set f = New CFile
>
> f.ReadFile "c:test.txt"
>
> For i = 0 To f.LineCount
> s = f.Lines(i)
> If Left(s, 6) = "blabla" Then
> s = ""
> f.SetLine i, s
> End If
> Next i
> f.SaveFile
>
> Je me trompe peut-être quelque part mais où ?
>
> Merci de votre aide
>
> Franck
>
>




Avatar
Zoury
hummm... t'as été chercher la toute dernière version?

*ici* le résultat final dans le fichier est la dernière ligne qui se répète.
ce qui est causé par le fait que le contenu est écrasé le nouveau texte. Ce
dernier possèdant une ligne de moins que le précédant donne l'impression que
le dernière se répète..

pour palier à ce bug, il faut supprimer le fichier dans la fonction
SaveFile() avant de le recréer...
'***
Public Sub SaveFile()

Dim hFile As Integer ' Handle du fichier
Dim sText As String ' Contenu du fichier

' Sort si aucun nom de fichier n'est spéficier
If LenB(m_sFile) = 0 Then
Exit Sub
End If

' Supprimer le fichier
Call Kill(m_sFile)

' Réduit le tableau et obtient le texte
If m_lIndex > -1 Then
ReDim Preserve m_sLignes(m_lIndex) As String
sText = Join(m_sLignes, vbNewLine)
End If

hFile = FreeFile
Open m_sFile For Binary As #hFile
Put #hFile, , sText
Close #hFile

End Sub
'***

si tu n'as pas encore télécharger le code le plus récent de la classe (le
lien se trouve dans mon premier message), essai le (incluant la modification
ci-haut) et dis moi si c'est correct.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"F. David" wrote in message
news:eZ$
Birarre, je viens de refaire un essai et cette fois-ci, ca me rajoute
juste "e 9" mais 2 lignes en dessous de la ligne9.
Puis un 3eme essai et ca me rajoute, juste un 9 cette fois-ci 3 ligne en
dessous de la ligne 9
Si je fais un 4eme essai, ca devrait être bon ;-)
Comment se fait-ce ? ;-)

Franck

F. David wrote:
> Merci beaucoup mais ce bout de code associé à la dernière version de
> la classe CFile donne cela chez moi :
>
> ligne 1
> ligne 2
> ligne 3
> ligne 4
> ligne 6
> ligne 7
> ligne 8
> ligne 9
>
> gne 9
>
> La ligne 5 est bien supprimée. Excellent ! En plus il n'y a pas de
> ligne vide mais il y a ce "gne 9" qui se rajoute à la fin.
> La ca va, c'est pas grand chose mais comme le véritable fichier sur
> lequel je bosse fait près de 10000 lignes, le bout de texte rajouté
> doit être énorme.
> Sinon, je n'ai pas encore testé l'autre méthode. Je vais voir mais je
> trouve cette façon de procéder bien meilleure. Dommage qu'il y ait ce
> 'gne9' à la fin ;-)
>
> Franck
>
>
> Zoury wrote:
>> Salut Simon! :O)
>>
>> La dernière version de CFile comprend une fonction ReplaceText.. le
>> problème est toutefois le même que celui mentionné dans mon autre
>> message, on se retrouve avec 2 vbNewLine de suite.. on peut toutefois
>> résoudre ce problème de cette façon :
>>
>> text.txt :
>> ligne 1
>> ligne 2
>> ligne 3
>> ligne 4
>> ligne 5
>> ligne 6
>> ligne 7
>> ligne 8
>> ligne 9
>>
>> '***
>> Option Explicit
>>
>> Private Sub Form_Load()
>> Dim f As CFile
>> Dim i As Long
>>
>> Set f = New CFile
>> Call f.OpenFile("c:test.txt")
>>
>> Call f.ReplaceText("ligne 5" & vbNewLine, "")
>> Debug.Print f.Text
>>
>> End Sub
>> '***
>>
>> Résultat :
>> ligne 1
>> ligne 2
>> ligne 3
>> ligne 4
>> ligne 6
>> ligne 7
>> ligne 8
>> ligne 9
>>
>> Et je crois que c'est plus rapide que la solution mentionnée dans mon
>> message précédent.
>>
>>
>> Merci de poster les réponses au groupe afin d'en faire profiter à
>> tous "Bismark Prods" wrote in message
>> news:
>>> Pourquoi tu ne retouche pas la classe CFile pour y adjoindre une
>>> méthode Replace ? Ainsi tu pourrais remplacer blabla par rien ! et
>>> ca serait plus simple et sans doute plus clair.
>>>
>>>
>>> "F. David" a écrit dans le message de
>>> news:
>>>> Bonjour,
>>>>
>>>> Pour les besoins d'une petite application personnelle, j'aurais
>>>> besoin de supprimer une ligne dans un fichier texte lorsque cette
>>>> ligne contient le mot "blabla".
>>>> J'ai jeté un coup d'oeil dans les archives et j'ai trouvé une
>>>> classe CFile (de Yanick Lefebvre) qui permet de faire ça.
>>>>
>>>> Ca marche bien sauf que ca me rajoute des lignes supplémentaires à
>>>> la fin du fichier texte.
>>>> Est-ce que quelqu'un aurait une idée. Voici mon code :
>>>>
>>>> Dim f As CFile
>>>> Dim i As Long
>>>> Dim s As String
>>>> Set f = New CFile
>>>>
>>>> f.ReadFile "c:test.txt"
>>>>
>>>> For i = 0 To f.LineCount
>>>> s = f.Lines(i)
>>>> If Left(s, 6) = "blabla" Then
>>>> s = ""
>>>> f.SetLine i, s
>>>> End If
>>>> Next i
>>>> f.SaveFile
>>>>
>>>> Je me trompe peut-être quelque part mais où ?
>>>>
>>>> Merci de votre aide
>>>>
>>>> Franck



Avatar
F. David
Merci beaucoup mais ce bout de code associé à la dernière version de la
classe CFile donne cela chez moi :

ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

gne 9

La ligne 5 est bien supprimée. Excellent ! En plus il n'y a pas de ligne
vide mais il y a ce "gne 9" qui se rajoute à la fin.
La ca va, c'est pas grand chose mais comme le véritable fichier sur
lequel je bosse fait près de 10000 lignes, le bout de texte rajouté doit
être énorme.
Sinon, je n'ai pas encore testé l'autre méthode. Je vais voir mais je
trouve cette façon de procéder bien meilleure. Dommage qu'il y ait ce
'gne9' à la fin ;-)

Franck


Zoury wrote:
Salut Simon! :O)

La dernière version de CFile comprend une fonction ReplaceText.. le
problème est toutefois le même que celui mentionné dans mon autre
message, on se retrouve avec 2 vbNewLine de suite.. on peut toutefois
résoudre ce problème de cette façon :

text.txt :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 5
ligne 6
ligne 7
ligne 8
ligne 9

'***
Option Explicit

Private Sub Form_Load()
Dim f As CFile
Dim i As Long

Set f = New CFile
Call f.OpenFile("c:test.txt")

Call f.ReplaceText("ligne 5" & vbNewLine, "")
Debug.Print f.Text

End Sub
'***

Résultat :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

Et je crois que c'est plus rapide que la solution mentionnée dans mon
message précédent.


Merci de poster les réponses au groupe afin d'en faire profiter à tous
"Bismark Prods" wrote in message
news:
Pourquoi tu ne retouche pas la classe CFile pour y adjoindre une
méthode Replace ? Ainsi tu pourrais remplacer blabla par rien ! et
ca serait plus simple et sans doute plus clair.


"F. David" a écrit dans le message de
news:
Bonjour,

Pour les besoins d'une petite application personnelle, j'aurais
besoin de supprimer une ligne dans un fichier texte lorsque cette
ligne contient le mot "blabla".
J'ai jeté un coup d'oeil dans les archives et j'ai trouvé une classe
CFile (de Yanick Lefebvre) qui permet de faire ça.

Ca marche bien sauf que ca me rajoute des lignes supplémentaires à
la fin du fichier texte.
Est-ce que quelqu'un aurait une idée. Voici mon code :

Dim f As CFile
Dim i As Long
Dim s As String
Set f = New CFile

f.ReadFile "c:test.txt"

For i = 0 To f.LineCount
s = f.Lines(i)
If Left(s, 6) = "blabla" Then
s = ""
f.SetLine i, s
End If
Next i
f.SaveFile

Je me trompe peut-être quelque part mais où ?

Merci de votre aide

Franck






Avatar
F. David
Birarre, je viens de refaire un essai et cette fois-ci, ca me rajoute
juste "e 9" mais 2 lignes en dessous de la ligne9.
Puis un 3eme essai et ca me rajoute, juste un 9 cette fois-ci 3 ligne en
dessous de la ligne 9
Si je fais un 4eme essai, ca devrait être bon ;-)
Comment se fait-ce ? ;-)

Franck

F. David wrote:
Merci beaucoup mais ce bout de code associé à la dernière version de
la classe CFile donne cela chez moi :

ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

gne 9

La ligne 5 est bien supprimée. Excellent ! En plus il n'y a pas de
ligne vide mais il y a ce "gne 9" qui se rajoute à la fin.
La ca va, c'est pas grand chose mais comme le véritable fichier sur
lequel je bosse fait près de 10000 lignes, le bout de texte rajouté
doit être énorme.
Sinon, je n'ai pas encore testé l'autre méthode. Je vais voir mais je
trouve cette façon de procéder bien meilleure. Dommage qu'il y ait ce
'gne9' à la fin ;-)

Franck


Zoury wrote:
Salut Simon! :O)

La dernière version de CFile comprend une fonction ReplaceText.. le
problème est toutefois le même que celui mentionné dans mon autre
message, on se retrouve avec 2 vbNewLine de suite.. on peut toutefois
résoudre ce problème de cette façon :

text.txt :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 5
ligne 6
ligne 7
ligne 8
ligne 9

'***
Option Explicit

Private Sub Form_Load()
Dim f As CFile
Dim i As Long

Set f = New CFile
Call f.OpenFile("c:test.txt")

Call f.ReplaceText("ligne 5" & vbNewLine, "")
Debug.Print f.Text

End Sub
'***

Résultat :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

Et je crois que c'est plus rapide que la solution mentionnée dans mon
message précédent.


Merci de poster les réponses au groupe afin d'en faire profiter à
tous "Bismark Prods" wrote in message
news:
Pourquoi tu ne retouche pas la classe CFile pour y adjoindre une
méthode Replace ? Ainsi tu pourrais remplacer blabla par rien ! et
ca serait plus simple et sans doute plus clair.


"F. David" a écrit dans le message de
news:
Bonjour,

Pour les besoins d'une petite application personnelle, j'aurais
besoin de supprimer une ligne dans un fichier texte lorsque cette
ligne contient le mot "blabla".
J'ai jeté un coup d'oeil dans les archives et j'ai trouvé une
classe CFile (de Yanick Lefebvre) qui permet de faire ça.

Ca marche bien sauf que ca me rajoute des lignes supplémentaires à
la fin du fichier texte.
Est-ce que quelqu'un aurait une idée. Voici mon code :

Dim f As CFile
Dim i As Long
Dim s As String
Set f = New CFile

f.ReadFile "c:test.txt"

For i = 0 To f.LineCount
s = f.Lines(i)
If Left(s, 6) = "blabla" Then
s = ""
f.SetLine i, s
End If
Next i
f.SaveFile

Je me trompe peut-être quelque part mais où ?

Merci de votre aide

Franck








Avatar
F. David
Oui bien sûr, j'ai été chercher la dernière version avec le lien que tu
as donné. Parfois j'ai la dernière ligne qui se répète mais parfois
aussi juste un bout de la dernière ligne et cela quelques lignes en
dessous de la ligne9. A chaque fois avant de tester, je recrée le
fichier test.txt original bien sûr. Je n'ai que VB6, je ne sais pas si
cela peut avoir un rapport.
Je vais faire des essais avec ce que tu dis et te tiens au courant mais
ca sera sans doute pour demain.
Bonne soirée

Franck

Zoury wrote:
hummm... t'as été chercher la toute dernière version?

*ici* le résultat final dans le fichier est la dernière ligne qui se
répète. ce qui est causé par le fait que le contenu est écrasé le
nouveau texte. Ce dernier possèdant une ligne de moins que le
précédant donne l'impression que le dernière se répète..

pour palier à ce bug, il faut supprimer le fichier dans la fonction
SaveFile() avant de le recréer...
'***
Public Sub SaveFile()

Dim hFile As Integer ' Handle du fichier
Dim sText As String ' Contenu du fichier

' Sort si aucun nom de fichier n'est spéficier
If LenB(m_sFile) = 0 Then
Exit Sub
End If

' Supprimer le fichier
Call Kill(m_sFile)

' Réduit le tableau et obtient le texte
If m_lIndex > -1 Then
ReDim Preserve m_sLignes(m_lIndex) As String
sText = Join(m_sLignes, vbNewLine)
End If

hFile = FreeFile
Open m_sFile For Binary As #hFile
Put #hFile, , sText
Close #hFile

End Sub
'***

si tu n'as pas encore télécharger le code le plus récent de la classe
(le lien se trouve dans mon premier message), essai le (incluant la
modification ci-haut) et dis moi si c'est correct.


Merci de poster les réponses au groupe afin d'en faire profiter à tous
"F. David" wrote in message
news:eZ$
Birarre, je viens de refaire un essai et cette fois-ci, ca me rajoute
juste "e 9" mais 2 lignes en dessous de la ligne9.
Puis un 3eme essai et ca me rajoute, juste un 9 cette fois-ci 3
ligne en dessous de la ligne 9
Si je fais un 4eme essai, ca devrait être bon ;-)
Comment se fait-ce ? ;-)

Franck

F. David wrote:
Merci beaucoup mais ce bout de code associé à la dernière version de
la classe CFile donne cela chez moi :

ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

gne 9

La ligne 5 est bien supprimée. Excellent ! En plus il n'y a pas de
ligne vide mais il y a ce "gne 9" qui se rajoute à la fin.
La ca va, c'est pas grand chose mais comme le véritable fichier sur
lequel je bosse fait près de 10000 lignes, le bout de texte rajouté
doit être énorme.
Sinon, je n'ai pas encore testé l'autre méthode. Je vais voir mais
je trouve cette façon de procéder bien meilleure. Dommage qu'il y
ait ce 'gne9' à la fin ;-)

Franck


Zoury wrote:
Salut Simon! :O)

La dernière version de CFile comprend une fonction ReplaceText.. le
problème est toutefois le même que celui mentionné dans mon autre
message, on se retrouve avec 2 vbNewLine de suite.. on peut
toutefois résoudre ce problème de cette façon :

text.txt :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 5
ligne 6
ligne 7
ligne 8
ligne 9

'***
Option Explicit

Private Sub Form_Load()
Dim f As CFile
Dim i As Long

Set f = New CFile
Call f.OpenFile("c:test.txt")

Call f.ReplaceText("ligne 5" & vbNewLine, "")
Debug.Print f.Text

End Sub
'***

Résultat :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

Et je crois que c'est plus rapide que la solution mentionnée dans
mon message précédent.


Merci de poster les réponses au groupe afin d'en faire profiter à
tous "Bismark Prods" wrote in message
news:
Pourquoi tu ne retouche pas la classe CFile pour y adjoindre une
méthode Replace ? Ainsi tu pourrais remplacer blabla par rien ! et
ca serait plus simple et sans doute plus clair.


"F. David" a écrit dans le message de
news:
Bonjour,

Pour les besoins d'une petite application personnelle, j'aurais
besoin de supprimer une ligne dans un fichier texte lorsque cette
ligne contient le mot "blabla".
J'ai jeté un coup d'oeil dans les archives et j'ai trouvé une
classe CFile (de Yanick Lefebvre) qui permet de faire ça.

Ca marche bien sauf que ca me rajoute des lignes supplémentaires
à la fin du fichier texte.
Est-ce que quelqu'un aurait une idée. Voici mon code :

Dim f As CFile
Dim i As Long
Dim s As String
Set f = New CFile

f.ReadFile "c:test.txt"

For i = 0 To f.LineCount
s = f.Lines(i)
If Left(s, 6) = "blabla" Then
s = ""
f.SetLine i, s
End If
Next i
f.SaveFile

Je me trompe peut-être quelque part mais où ?

Merci de votre aide

Franck












Avatar
Zoury
Ah! Ça me rassure! :O)
Je ne trouvais vraiment pas où était le problème.. ;O)
Avatar
F. David
Zoury wrote:
hummm... t'as été chercher la toute dernière version?



Pour enlever toute ambiguité, voici exactement mon code

Une feuille avec un bouton :

Option Explicit
Private Sub Command1_Click()
Dim f As CFile
Dim i As Long

Set f = New CFile
Call f.OpenFile("c:test.txt")
Call f.ReplaceText("ligne 5" & vbNewLine, "")
f.SaveFile
End Sub

Et la classe CFile :
(j'ai juste enlevé la dernière fonction qui posait problème lorsque j'ai
voulu créer l'exe)

Option Explicit

Private m_sLignes() As String ' lines
Private Const BUFFER_SIZE As Long = 500 ' buffer size
Private m_lIndex As Long ' current index
Private m_sFile As String ' filename

'**************************************
' Returns the corresponding line
'**************************************
Public Property Get Lines(ByRef lNumLine As Long) As String
If lNumLine > 0 And lNumLine <= (UBound(m_sLignes) + 1) Then
Lines = m_sLignes(lNumLine - 1)
End If
End Property

'**************************************
' Modifies the corresponding line
'**************************************
Public Property Let Lines _
( _
ByRef lNumLine As Long, _
ByRef sLine As String _
)
If lNumLine > 0 And lNumLine <= (UBound(m_sLignes) + 1) Then
m_sLignes(lNumLine - 1) = sLine
End If
End Property

'**************************************
' Add a line
'**************************************
Public Function AppendLine(ByRef sLine As String) As String

m_lIndex = m_lIndex + 1
If Not (m_lIndex <= UBound(m_sLignes)) Then
ReDim Preserve m_sLignes(UBound(m_sLignes) + BUFFER_SIZE) As
String
End If
m_sLignes(m_lIndex) = sLine

End Function

'**************************************
' Append text to the end of the file
'**************************************
Public Function Append(ByRef sText As String) As String

Dim s() As String
Dim i As Long

s = Split(sText, vbNewLine)

If m_lIndex = -1 Then
m_lIndex = m_lIndex + 1
If Not (m_lIndex <= UBound(m_sLignes)) Then
ReDim Preserve m_sLignes(UBound(m_sLignes) + BUFFER_SIZE) As
String

End If
End If
m_sLignes(m_lIndex) = m_sLignes(m_lIndex) & s(0)
For i = 1 To UBound(s)
Call AppendLine(s(i))
Next i

End Function

'**************************************
' Returns the current file text
'**************************************
Public Property Get Text() As String
Dim s() As String
s = m_sLignes
ReDim Preserve s(m_lIndex) As String
Text = Join(s, vbNewLine)
End Property

'**************************************
' Returns the number of lines
'**************************************
Public Property Get LineCount() As Long
LineCount = m_lIndex + 1
End Property

'**************************************
' Read the file and fill our object
' with it
'**************************************
Public Function OpenFile(ByRef sFile As String) As String

OpenFile = GetFileContent(sFile)
If LenB(OpenFile) <> 0 Then
m_sFile = sFile
m_sLignes = Split(OpenFile, vbNewLine)
m_lIndex = UBound(m_sLignes)
End If

End Function

'*****************************
' Return the file content
'*****************************
Private Function GetFileContent(ByRef sFile As String) As String

Dim hFile As Integer ' Handle du fichier
Dim sText As String ' Contenu du fichier

' Sort le fichier n'existe pas...
If Not FileExists(sFile) Then
Err.Raise 53
Exit Function
End If

hFile = FreeFile
Open sFile For Binary As #hFile
sText = Space$(LOF(hFile))
Get #hFile, , sText
Close #hFile

GetFileContent = sText

End Function

'**************************************
' Save the file with another name
'**************************************
Public Sub SaveFileAs(ByRef sFile As String)

Dim hFile As Integer ' Handle du fichier
Dim sText As String ' Contenu du fichier

m_sFile = sFile

If FileExists(sFile) Then
Kill sFile
End If

' Réduit le tableau et obtient le texte
If m_lIndex > -1 Then
ReDim Preserve m_sLignes(m_lIndex) As String
sText = Join(m_sLignes, vbNewLine)
End If

hFile = FreeFile
Open sFile For Binary As #hFile
Put #hFile, , sText
Close #hFile

End Sub

'**************************************
' Overwrite the existing file
'**************************************
Public Sub SaveFile()

Dim hFile As Integer ' Handle du fichier
Dim sText As String ' Contenu du fichier

' Sort si aucun nom de fichier n'est spéficier
If LenB(m_sFile) = 0 Then
Exit Sub
End If

' Réduit le tableau et obtient le texte
If m_lIndex > -1 Then
ReDim Preserve m_sLignes(m_lIndex) As String
sText = Join(m_sLignes, vbNewLine)
End If

hFile = FreeFile
Open m_sFile For Binary As #hFile
Put #hFile, , sText
Close #hFile

End Sub

'**************************************
' Initialize our object
'**************************************
Private Sub Class_Initialize()
m_sLignes = Split("", " ")
m_lIndex = -1
End Sub

'**************************************
' Returns True if the file exists
'**************************************
Private Function FileExists(ByRef sFile As String) As Boolean
On Error Resume Next
FileExists = ((GetAttr(sFile) And vbDirectory) = 0)
End Function

'**************************************
' Append the specified file content
' to our file
'**************************************
Public Function AppendFile(ByRef sFile As String) As String

AppendFile = GetFileContent(sFile)
If LenB(AppendFile) <> 0 Then
Call Append(AppendFile)
End If

End Function

'**************************************
' Replace the sFind text for the
' sReplace one in the file
'**************************************
Public Sub ReplaceText _
( _
ByRef sFind As String, _
ByRef sReplace As String, _
Optional ByRef lStart As Long = 1, _
Optional ByRef lCount As Long = -1, _
Optional ByRef cm As VbCompareMethod = vbBinaryCompare _
)

m_sLignes = Split(Replace(Text, sFind, sReplace, lStart, lCount,
cm), vbNewLine)

m_lIndex = UBound(m_sLignes)

End Sub

'**************************************
' Returns the first position
' of sFind in the file
'**************************************
Public Function IndexOf _
( _
ByRef sFind As String, _
Optional ByRef lStart As Long = 1, _
Optional ByRef cm As VbCompareMethod = vbBinaryCompare _
) As Long
IndexOf = InStr(lStart, Text, sFind, cm)
End Function
Avatar
F. David
ok pas de problème, ça fonctionne en rajoutant cette instruction.
Formidable !
Merci beaucoup !
Bonne fin de soirée

Zoury wrote:
hummm... t'as été chercher la toute dernière version?

*ici* le résultat final dans le fichier est la dernière ligne qui se
répète. ce qui est causé par le fait que le contenu est écrasé le
nouveau texte. Ce dernier possèdant une ligne de moins que le
précédant donne l'impression que le dernière se répète..

pour palier à ce bug, il faut supprimer le fichier dans la fonction
SaveFile() avant de le recréer...
'***
Public Sub SaveFile()

Dim hFile As Integer ' Handle du fichier
Dim sText As String ' Contenu du fichier

' Sort si aucun nom de fichier n'est spéficier
If LenB(m_sFile) = 0 Then
Exit Sub
End If

' Supprimer le fichier
Call Kill(m_sFile)

' Réduit le tableau et obtient le texte
If m_lIndex > -1 Then
ReDim Preserve m_sLignes(m_lIndex) As String
sText = Join(m_sLignes, vbNewLine)
End If

hFile = FreeFile
Open m_sFile For Binary As #hFile
Put #hFile, , sText
Close #hFile

End Sub
'***

si tu n'as pas encore télécharger le code le plus récent de la classe
(le lien se trouve dans mon premier message), essai le (incluant la
modification ci-haut) et dis moi si c'est correct.


Merci de poster les réponses au groupe afin d'en faire profiter à tous
"F. David" wrote in message
news:eZ$
Birarre, je viens de refaire un essai et cette fois-ci, ca me rajoute
juste "e 9" mais 2 lignes en dessous de la ligne9.
Puis un 3eme essai et ca me rajoute, juste un 9 cette fois-ci 3
ligne en dessous de la ligne 9
Si je fais un 4eme essai, ca devrait être bon ;-)
Comment se fait-ce ? ;-)

Franck

F. David wrote:
Merci beaucoup mais ce bout de code associé à la dernière version de
la classe CFile donne cela chez moi :

ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

gne 9

La ligne 5 est bien supprimée. Excellent ! En plus il n'y a pas de
ligne vide mais il y a ce "gne 9" qui se rajoute à la fin.
La ca va, c'est pas grand chose mais comme le véritable fichier sur
lequel je bosse fait près de 10000 lignes, le bout de texte rajouté
doit être énorme.
Sinon, je n'ai pas encore testé l'autre méthode. Je vais voir mais
je trouve cette façon de procéder bien meilleure. Dommage qu'il y
ait ce 'gne9' à la fin ;-)

Franck


Zoury wrote:
Salut Simon! :O)

La dernière version de CFile comprend une fonction ReplaceText.. le
problème est toutefois le même que celui mentionné dans mon autre
message, on se retrouve avec 2 vbNewLine de suite.. on peut
toutefois résoudre ce problème de cette façon :

text.txt :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 5
ligne 6
ligne 7
ligne 8
ligne 9

'***
Option Explicit

Private Sub Form_Load()
Dim f As CFile
Dim i As Long

Set f = New CFile
Call f.OpenFile("c:test.txt")

Call f.ReplaceText("ligne 5" & vbNewLine, "")
Debug.Print f.Text

End Sub
'***

Résultat :
ligne 1
ligne 2
ligne 3
ligne 4
ligne 6
ligne 7
ligne 8
ligne 9

Et je crois que c'est plus rapide que la solution mentionnée dans
mon message précédent.


Merci de poster les réponses au groupe afin d'en faire profiter à
tous "Bismark Prods" wrote in message
news:
Pourquoi tu ne retouche pas la classe CFile pour y adjoindre une
méthode Replace ? Ainsi tu pourrais remplacer blabla par rien ! et
ca serait plus simple et sans doute plus clair.


"F. David" a écrit dans le message de
news:
Bonjour,

Pour les besoins d'une petite application personnelle, j'aurais
besoin de supprimer une ligne dans un fichier texte lorsque cette
ligne contient le mot "blabla".
J'ai jeté un coup d'oeil dans les archives et j'ai trouvé une
classe CFile (de Yanick Lefebvre) qui permet de faire ça.

Ca marche bien sauf que ca me rajoute des lignes supplémentaires
à la fin du fichier texte.
Est-ce que quelqu'un aurait une idée. Voici mon code :

Dim f As CFile
Dim i As Long
Dim s As String
Set f = New CFile

f.ReadFile "c:test.txt"

For i = 0 To f.LineCount
s = f.Lines(i)
If Left(s, 6) = "blabla" Then
s = ""
f.SetLine i, s
End If
Next i
f.SaveFile

Je me trompe peut-être quelque part mais où ?

Merci de votre aide

Franck












1 2 3