OVH Cloud OVH Cloud

Fichier texte : suppression de lignes

4 réponses
Avatar
Shewy80
Bonjour à tous

Existe t il un moyen simple et rapide de supprimer une ligne dans un fichier
texte, sans ré-écrire tout le fichier ??

J'ai limité le nombre de lignes possible contenu dans le fichier à 32760. (à
cause d'un dim i as integer)
c'est largement suffisant pour ce que j'ai à faire.

Je voudrai par exemple supprimer les lignes 2 à [n]
[n] etant une valeur saisie par l'utilisateur désireux de faire une purge du
fichier devenu trop gros.

La ligne 1 étant les entetes de champs. Les champs sont séparés par un [ ; ]

Merci de vos conseils

4 réponses

Avatar
LE TROLL
Salut,

A ma connaissance il n'existe pas de moyen de faire
directement ce que tu veux faire, c'est le rôle de la
programmation des fichiers de gérer ça...

Par contre, tu peux marquer ces lignes dans le fichier,
par exemple devant "$$$" (en prévoyant ce mot réservé), ou
dan un autre fichier, et ainsi, tu peux sauter ces lignes en
les lisant avec le programme. Tu peux même faire une gestion
plus élaborée, en remplissant de nouveau les lignes libérées
quand une autre saisie survient...
------------

"Shewy80" a écrit dans le message
de news: d5lm2u$iok$
Bonjour à tous

Existe t il un moyen simple et rapide de supprimer une
ligne dans un fichier
texte, sans ré-écrire tout le fichier ??

J'ai limité le nombre de lignes possible contenu dans le
fichier à 32760. (à
cause d'un dim i as integer)
c'est largement suffisant pour ce que j'ai à faire.

Je voudrai par exemple supprimer les lignes 2 à [n]
[n] etant une valeur saisie par l'utilisateur désireux de
faire une purge du
fichier devenu trop gros.

La ligne 1 étant les entetes de champs. Les champs sont
séparés par un [ ; ]

Merci de vos conseils




Avatar
Aski
Salutatoi,

En folâtrant sur son clavier, Shewy80 s'est exprimé ainsi :

|| Existe t il un moyen simple et rapide de supprimer une ligne dans un
|| fichier texte, sans ré-écrire tout le fichier ??
||
|| Je voudrai par exemple supprimer les lignes 2 à [n]
|| [n] etant une valeur saisie par l'utilisateur désireux de faire une
|| purge du fichier devenu trop gros.

Peux-tu préciser si n est la dernière ligne ?
Sinon, pourquoi ne pas utiliser un fichier à accès direct ?

--
Aski

AntiSpamEdit, aide de K9 en français
http://h.dechily.free.fr/
http://h.charlier.de.chily.perso.cegetel.net/index.htm
Avatar
Zoury
Salut Shewy !

Existe t il un moyen simple et rapide de supprimer une ligne dans un


fichier
texte, sans ré-écrire tout le fichier ??



La technique la plus efficace serait d'ouvrir un nouveau fichier et de n'y
copier que les lignes devant être conservées. Étant donnée que le nombre de
lignes de ton fichier est assez limité, tu peux employé ma classe CFile pour
accomplir ceci :
'***
' Module1
Option Explicit

Private Sub Main()

Dim f As CFile

Set f = New CFile
Call f.OpenFile("c:file.txt")
Call f.RemoveLines(2, 5)
Call f.SaveFile

End Sub
'***

Voici la dernière version de la classe :
'***
' CFile Class
Option Explicit

Private m_sLignes() As String ' lines
Private Const BUFFER_SIZE As Long = 500 ' buffer size
Private m_lLastIndex As Long ' current last index
Private m_sFileName 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_lLastIndex = m_lLastIndex + 1
If Not (m_lLastIndex <= UBound(m_sLignes)) Then
ReDim Preserve m_sLignes(UBound(m_sLignes) + BUFFER_SIZE) As String
End If
m_sLignes(m_lLastIndex) = 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_lLastIndex = -1 Then
m_lLastIndex = m_lLastIndex + 1
If Not (m_lLastIndex <= UBound(m_sLignes)) Then
ReDim Preserve m_sLignes(UBound(m_sLignes) + BUFFER_SIZE) As
String
End If
End If
m_sLignes(m_lLastIndex) = m_sLignes(m_lLastIndex) & 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_lLastIndex) As String
Text = Join(s, vbNewLine)
End Property

'**************************************
' Returns the number of lines
'**************************************
Public Property Get LineCount() As Long
LineCount = m_lLastIndex + 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_sFileName = sFile
m_sLignes = Split(OpenFile, vbNewLine)
m_lLastIndex = 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
Call 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_sFileName = sFile

If FileExists(sFile) Then
Call Kill(sFile)
End If

' Réduit le tableau et obtient le texte
If m_lLastIndex > -1 Then
ReDim Preserve m_sLignes(m_lLastIndex) 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_sFileName) = 0 Then
Exit Sub
End If

' Supprimer le fichier
Call Kill(m_sFileName)

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

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

End Sub

'**************************************
' Initialize our object
'**************************************
Private Sub Class_Initialize()
m_sLignes = Split("", " ")
m_lLastIndex = -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_lLastIndex = 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

'**************************************
' Returns the last position
' of sFind in the file
'**************************************
Public Function LastIndexOf _
( _
ByRef sFind As String, _
Optional ByRef lStart As Long = 1, _
Optional ByRef cm As VbCompareMethod = vbBinaryCompare _
) As Long
IndexOf = InStrRev(Text, sFind, lStart, cm)
End Function

'**************************************
' 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

'**************************************
' Removes the specified range of lines
'**************************************
Public Sub RemoveLines(ByRef lStartIndex As Long, _
ByRef lLastIndex 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 < (lStartIndex - 1) Or _
i > (lLastIndex - 1)) Then
s(lCurIndex) = m_sLignes(i)
lCurIndex = lCurIndex + 1
End If
Next i

m_lLastIndex = m_lLastIndex - 1
m_sLignes = s

End Sub

'***************************************
' Returns the actual file name
'***************************************
Public Property Get FileName() As String
FileName = m_sFileName
End Property
'***

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Shewy80
pouhhaa !! j'arrive po à tout comprendre !
c une putain de belle classe ça ! on peux meme dire c'est la class ! LOL
je vais essayer de l'implémenter dans mon projet et d'éxécuter pas à pas.

Merci Bcp