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
c'est amusant ! tu te mets a faire ta classe cfile dans l'option .net ? lol

(je dis ca pour le indexof)


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Ah! Ça me rassure! :O)
Je ne trouvais vraiment pas où était le problème.. ;O)




Avatar
Zoury
Yep! Je trouves la pluspart des noms de fonctions ou de propriétés beaucoup
plus intuitif en .NET... Notament pour le IndexOf, LastIndexOf, SubString,
etc... C'est un des avantages des nouvelles librairies. ;O)

--
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
Bismark Prods
substring existe depuis bien longtemps dans les sgbd !

"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:
Yep! Je trouves la pluspart des noms de fonctions ou de propriétés


beaucoup
plus intuitif en .NET... Notament pour le IndexOf, LastIndexOf, SubString,
etc... C'est un des avantages des nouvelles librairies. ;O)

--
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
oui j'sais.. j'comparais évidemment avec les fonctions de VB (et BASIC). Qui
existe depuis longtemps également.. ;O)
Avatar
Bismark Prods
T'a fait un super boulot en tout cas sur cette classe ! je te félicite


"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news:%
oui j'sais.. j'comparais évidemment avec les fonctions de VB (et BASIC).


Qui
existe depuis longtemps également.. ;O)




Avatar
Bismark Prods
D'après ce que j'ai compris en interne la classe CFile gère chaque ligne
dans un tableau, si tel est vraiment le cas ! il me semble qu'il serait très
aisé de faire une méthode genre RemoveLine qui comme son nom l'indiquera,
retire une ligne complete selon critères !!!!


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

Je suis entièrement d'accord. Pour moi qui n'ai pas touché une ligne de
code depuis des lustres et qui m'y suis remis avant hier soir, ce genre
de classe me facilite la tâche. Merci à lui de mettre cela à disposition
du plus grand nombre.

Cela dit, je n'ai pas encore résolu mon petit problème complétement. En
fait, vous vous en doutez, le traitement que je dois effectuer est un
petit peu plus complexe. J'explique :

Dans le fichier test.txt suivant, je voudrais supprimer *à la fois* les
lignes qui contiennent le mot "blabla" et le mot "blablabla"

01 blabla
02 un autre texte
03 blablabla
04 blabla
05 un autre texte
06 blablabla
07 blabla
08 un autre texte
09 blablabla
10 blabla
11 un autre texte
12 blablabla
13 blabla

pour obtenir :

02 un autre texte
05 un autre texte
08 un autre texte
11 un autre texte

Voici mon code (toujours associé à la classe CFile) :

Private Sub Command1_Click()
Dim f As CFile
Dim i As Long
Dim s As String

Set f = New CFile
Call f.OpenFile("c:test.txt")
For i = 1 To f.LineCount
s = f.Lines(i)
If Mid(s, 4, 6) = "blabla" Or Mid(s, 4, 9) = "blablabla" Then
Call f.ReplaceText(s & vbNewLine, "")
End If
Next i
Call f.SaveFile
End Sub

Voici ce que j'obtiens :
02 un autre texte
04 blabla
05 un autre texte
07 blabla
08 un autre texte
10 blabla
11 un autre texte
13 blabla

Bizarrement, la ligne contenant "blabla" n'est pas supprimée. Au lieu du
"or", j'ai tenté de mettre 2 fois l'opération bout à bout mais le
résultat est identique. Y aurait-il moyen de faire fonctionner cela
toujours en se servant de la classe CFile bien sûr ?

Encore merci
Franck



Bismark Prods wrote:
> T'a fait un super boulot en tout cas sur cette classe ! je te félicite



Avatar
F. David
Bonjour,

Je suis entièrement d'accord. Pour moi qui n'ai pas touché une ligne de
code depuis des lustres et qui m'y suis remis avant hier soir, ce genre
de classe me facilite la tâche. Merci à lui de mettre cela à disposition
du plus grand nombre.

Cela dit, je n'ai pas encore résolu mon petit problème complétement. En
fait, vous vous en doutez, le traitement que je dois effectuer est un
petit peu plus complexe. J'explique :

Dans le fichier test.txt suivant, je voudrais supprimer *à la fois* les
lignes qui contiennent le mot "blabla" et le mot "blablabla"

01 blabla
02 un autre texte
03 blablabla
04 blabla
05 un autre texte
06 blablabla
07 blabla
08 un autre texte
09 blablabla
10 blabla
11 un autre texte
12 blablabla
13 blabla

pour obtenir :

02 un autre texte
05 un autre texte
08 un autre texte
11 un autre texte

Voici mon code (toujours associé à la classe CFile) :

Private Sub Command1_Click()
Dim f As CFile
Dim i As Long
Dim s As String

Set f = New CFile
Call f.OpenFile("c:test.txt")
For i = 1 To f.LineCount
s = f.Lines(i)
If Mid(s, 4, 6) = "blabla" Or Mid(s, 4, 9) = "blablabla" Then
Call f.ReplaceText(s & vbNewLine, "")
End If
Next i
Call f.SaveFile
End Sub

Voici ce que j'obtiens :
02 un autre texte
04 blabla
05 un autre texte
07 blabla
08 un autre texte
10 blabla
11 un autre texte
13 blabla

Bizarrement, la ligne contenant "blabla" n'est pas supprimée. Au lieu du
"or", j'ai tenté de mettre 2 fois l'opération bout à bout mais le
résultat est identique. Y aurait-il moyen de faire fonctionner cela
toujours en se servant de la classe CFile bien sûr ?

Encore merci
Franck



Bismark Prods wrote:
T'a fait un super boulot en tout cas sur cette classe ! je te félicite


Avatar
F. David
Bien sûr lorsque j'enlève le 'vbNewLine', ça fonctionne mais j'obtiens
des lignes vides. Je pourrais éventuellement récupérer les lignes ne
contenant pas de "blabla", les stocker dans une string et réécrire le
fichier mais je voudrais juste savoir s'il n'y aurait pas une autre
solution ?
Enfin bref, je voudrais si possible pas de blabla mais du résultat ;-)
Merci

Franck

F. David wrote:
Bizarrement, la ligne contenant "blabla" n'est pas supprimée. Au lieu
du "or", j'ai tenté de mettre 2 fois l'opération bout à bout mais le
résultat est identique. Y aurait-il moyen de faire fonctionner cela
toujours en se servant de la classe CFile bien sûr ?


Avatar
F. David
De mon côté, j'avoue que je ne comprends pas tout le fonctionnement de
cette classe et je ne serais pas assez calé pour faire cette méthode ;-)
En fait, ça marche bien pour une suppression selon un critère mais au
delà, ça coince, j'ai l'impression mais Yanick va bien nous trouver
quelque chose dont il a le secret, non ? ,-)

Bismark Prods wrote:
D'après ce que j'ai compris en interne la classe CFile gère chaque
ligne dans un tableau, si tel est vraiment le cas ! il me semble
qu'il serait très aisé de faire une méthode genre RemoveLine qui
comme son nom l'indiquera, retire une ligne complete selon critères
!!!!


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

Je suis entièrement d'accord. Pour moi qui n'ai pas touché une ligne
de code depuis des lustres et qui m'y suis remis avant hier soir, ce
genre de classe me facilite la tâche. Merci à lui de mettre cela à
disposition du plus grand nombre.

Cela dit, je n'ai pas encore résolu mon petit problème complétement.
En fait, vous vous en doutez, le traitement que je dois effectuer
est un petit peu plus complexe. J'explique :

Dans le fichier test.txt suivant, je voudrais supprimer *à la fois*
les lignes qui contiennent le mot "blabla" et le mot "blablabla"

01 blabla
02 un autre texte
03 blablabla
04 blabla
05 un autre texte
06 blablabla
07 blabla
08 un autre texte
09 blablabla
10 blabla
11 un autre texte
12 blablabla
13 blabla

pour obtenir :

02 un autre texte
05 un autre texte
08 un autre texte
11 un autre texte

Voici mon code (toujours associé à la classe CFile) :

Private Sub Command1_Click()
Dim f As CFile
Dim i As Long
Dim s As String

Set f = New CFile
Call f.OpenFile("c:test.txt")
For i = 1 To f.LineCount
s = f.Lines(i)
If Mid(s, 4, 6) = "blabla" Or Mid(s, 4, 9) = "blablabla" Then
Call f.ReplaceText(s & vbNewLine, "")
End If
Next i
Call f.SaveFile
End Sub

Voici ce que j'obtiens :
02 un autre texte
04 blabla
05 un autre texte
07 blabla
08 un autre texte
10 blabla
11 un autre texte
13 blabla

Bizarrement, la ligne contenant "blabla" n'est pas supprimée. Au
lieu du "or", j'ai tenté de mettre 2 fois l'opération bout à bout
mais le résultat est identique. Y aurait-il moyen de faire
fonctionner cela toujours en se servant de la classe CFile bien sûr ?

Encore merci
Franck



Bismark Prods wrote:
T'a fait un super boulot en tout cas sur cette classe ! je te
félicite






Avatar
Zoury
Oui c'est possible.. ça fera le même travail que ma première solution.. :OP

ajoute cette fonction à la classe :
'***
'**************************************
' Removes the specified line
'**************************************
Public Sub RemoveLine(ByRef lIndex As Long)

Dim i As Long
Dim lCurIndex As Long
Dim s() As String
ReDim s(UBound(m_sLignes)) As String

For i = 0 To m_lLastIndex
If (i <> (lIndex - 1)) Then
s(lCurIndex) = m_sLignes(i)
lCurIndex = lCurIndex + 1
End If
Next i

m_lLastIndex = m_lLastIndex - 1
m_sLignes = s

End Sub
'***

tu peux l'utiliser comme ceci :
'***
Option Explicit

Private Sub Main()

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

Call f.OpenFile("c:test.txt")

' On doit faire une boucle inversé étant donnée
' que le contenu de f peut changer à chaque tour
For i = f.LineCount To 1 Step -1
If (f.Lines(i) Like "*blabla" Or f.Lines(i) Like "*blablabla") Then
Call f.RemoveLine(i)
End If
Next i

Call f.SaveFile

End Sub
'***

--
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
1 2 3