Supprimer text dans fichier txt (dotnet)

La Team a résolu l'affaire... Mais ça peut toujours servir !
Avatar du membre
Nash
Administrateur du site
Administrateur du site
Messages : 4403
Enregistré le : sam. 6 nov. 2010 14:19
Localisation : 89
    unknown unknown

Supprimer text dans fichier txt (dotnet)

Message par Nash »

Salut tous , je post cette demande vite fait , et je file a dijon pour mon gosse ;)

je voudrais supprimer une portion de texte dans un fichier txt :

pour une ligne pas de probleme (ou pour toute les lignes comportant "david), je fais :
Dim files As String = ("c:\test.Txt")
Dim lines As List(Of String) = System.IO.File.ReadAllLines(files).ToList
If lines.Count = 0 Then Continue For
For u = lines.Count - 1 To 0 Step -1
If lines(u).Contains("david")) Then
lines.RemoveAt(u)
End If
Next
System.IO.File.WriteAllLines(files, lines)
mais si je veux virer le texte entre "david et "david" de ce fichier txt ? sachant que le nombre de ligne peut etre aleatoire entre les deux "david" et que le 1er et dernier "david" peut etre present a n'importe quel endroit dans le fichier txt ;)
ddddddddddddddd
fgggggggggggg
yyyyyyyyyyyyyyyy
david
aaaaaaaaaaaaaaaaaaa
sssssssssssssss
yytttttttttttttttt
uuuuuuuuuuuuuuuuuuuu
david
eeeeeeeeeeeeeeeee
eeeeeeeeeeeeeeee
eeeeeeeeeeeeeeee
merci a ceux qui me répondront ;) j'y go a ce soir ...
Image
• Ryzen 9 5900x
• B550 AORUS PRO 
• RTX 3060ti phoenix 
• thermaltake core p8 tg
• 1 x SSD 500GB   PCIe4 M.2 SEA
• 32 G DDR4 3600 corsaire
• Corsaire 1000w full modulaire passive
• MasterLiquid ML240R RGB
•1 to stockage NVME.M2 PCIe
chrisnad
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par chrisnad »

:x :x heuuuuuu alors la !!!!!!!!! tu as pas un autre problème a résoudre par hasard looooooooool :116:
zexcelator
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par zexcelator »

Ben tu dois faire un truc comme ça non ? If NOT (lines(u).Contains("david"))) Then
Soulfate
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par Soulfate »

Avec un interrupteur (une variable binaire), ça le ferait.
Quand le script rencontre un "David", il se met sur 1 et ne recopie plus le texte. Quand il rencontre à nouveau David, il se remet sur 0 et reprend la copie du texte.

En BATCH :

Code : Tout sélectionner

set TargetStr=David
set File=Sample.txt

setlocal enabledelayedexpansion
for /f "usebackq delims=" %%a in ("%File%") do (
	if /i "!DoNotCopy!"=="true" (
		if /i "%%a"=="%TargetStr%" set DoNotCopy=false
	) else (
		if /i not "%%a"=="%TargetStr%" echo %%a>>"New_%File%"
		if /i "%%a"=="%TargetStr%" set DoNotCopy=true
	)
)
Avatar du membre
Nash
Administrateur du site
Administrateur du site
Messages : 4403
Enregistré le : sam. 6 nov. 2010 14:19
Localisation : 89
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par Nash »

@ sharp :

j'ai essayé avec la fonction que tu m'a faites pour un autre projet : (en chargeant le fichier txt dans une richtextbox avant)

RichTextBox1.Text = IO.File.ReadAllText("d:\test.txt")
Dim str() = ParseBetween((RichTextBox1.Text), "david", "david")
For Each occ In str
MsgBox(occ)
RichTextBox1.Text.Remove(occ) ------>erreur forcement
System.IO.File.WriteAllLines(RichTextBox1.Text, "d:\test2.txt")
Next

je recupere bien le texte entre les deux "david" , mais comment je peux le virer du fichier txt :(

@ soulfate : merci mais je prefererais en dotnet ...
Image
• Ryzen 9 5900x
• B550 AORUS PRO 
• RTX 3060ti phoenix 
• thermaltake core p8 tg
• 1 x SSD 500GB   PCIe4 M.2 SEA
• 32 G DDR4 3600 corsaire
• Corsaire 1000w full modulaire passive
• MasterLiquid ML240R RGB
•1 to stockage NVME.M2 PCIe
Avatar du membre
sh@rp
Membre VIP
Membre VIP
Messages : 585
Enregistré le : mar. 1 févr. 2011 13:03
Contact :
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par sh@rp »

@Nash : Soulfate a très clairement expliqué un algorithme de résolution du problème que tu rencontres. C'est le raisonnement qui compte, la mise en forme (en langage de programmation) vient après.
Bon comme d'hab il existe plusieurs manière (propre à chacun) de résoudre un problème donné mais en restant dans l'idée de Soulfate (sans parler du terme de variable binaire qui se traduit par variable de type booleen et que le seul bémol c'est que sa variable accepte 2 états ce qui ne permet pas de savoir si la 2ème occurrence est effectivement la dernière du fichier texte) voilà comment je procéderais :

But recherché : Nous souhaitons obtenir un texte situé entre 2 occurrences de mêmes nom en vue de le supprimer depuis un fichier texte !

Analyse :
* Pour pouvoir supprimer du texte entre 2 occurrences (la toute première et la toute dernière) il faut impérativement détecter sur quelles ligne elles se situent : FirstOccur et LastOccur pourraient nous indiquer leurs positions sur les lignes du fichier texte numéroté de 0 à n - 1 ou de 1 à n. Sans 2 positions identifiées = pas de suppression !

* Etant donné que l'on souhaite récupérer des numéros de lignes ainsi que les lignes associées alors on travaille avec un dictionnaire de données : Dictionary(Of Integer,String)

* On utilise un StreamReader pour parcourir le fichier texte ligne par ligne, à chaque passage de ligne on incrémente une variable iCount qui nous indique la position de la ligne en cours afin de stocker dans le dictionnaire l'association clé/valeur : Key = iCount, Value = Line.
Le dictionnaire est pourvu de toutes les lignes et leur numéro.

* On utilise LINK et les fonctions anonymes pour récupérer l'index de la 1ère occurrence (minLine) et la dernière (maxLine) trouvée dans le fichier texte.

* On ouvre un streamwriter et on parcours le dictionnaire pour écrire les lignes qui ne sont pas comprises entre la 1ère et la dernière occurrence trouvée préalablement. Enfin on écrit dans le fichier d'origine

Code : Tout sélectionner

        Dim occur = "david"
        Dim fPath = "C:\Users\jm\Desktop\test.txt"
        Dim lineCount%
        Dim originalLines = New Dictionary(Of Integer, String)

        Using sr = New StreamReader(fPath)
            Dim line = sr.ReadLine()
            While line IsNot Nothing
                lineCount += 1
                originalLines.Add(lineCount, line)
                line = sr.ReadLine()
            End While
            sr.Close()
        End Using

      Dim FoundedOccur As Collections.Generic.IEnumerable(Of Collections.Generic.KeyValuePair(Of Integer, String)) = originalLines.ToList.Where(Function(i) i.Value.Contains("david"))

        Dim minLine% = FoundedOccur.Aggregate(Function(j, k) If(j.Key < k.Key, j, k)).Key
        Dim maxLine% = FoundedOccur.Aggregate(Function(j, k) If(j.Key > k.Key, j, k)).Key

        If minLine < maxLine Then
            Using sw As New StreamWriter(fPath)
                For Each l In originalLines
                    If l.Key < minLine OrElse l.Key > maxLine Then
                        sw.Write(l.Value & vbNewLine)
                    End If
                Next
                sw.Close()
            End Using
        End If
Le secret : Se poser et raisonner avant de coder. ;)
Le dev ne se réduit pas à du simple copier/coller de codes sources mais à une incommensurable phase d'apprentissage d'un domaine en perpétuelle évolution !
http://3dotdevcoder.blogspot.fr/
Soulfate
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par Soulfate »

Ouah ça sent le prof d'algo :o :clap:

En lisant ce qu'a écrit Sh@rp, je remarque qu'il manque quelques infos de la part de Nash pour savoir exactement quel algorithme il souhaite :
- Y-a-t'il seulement 2 occurrences de "David" ou peut-il y en avoir plus ? Comment doit réagir le script s'il y a au moins 3 occurrences de "David" ?
- S'il peut effectivement y en avoir plus de 2 et que ça a de l'importance, doit-on être conscient de la toute première et toute dernière occurrence ? Si oui, il faudra d'abord scanner le fichier pour que le script connaisse sa composition et adapte son comportement en conséquence, comme l'a écrit Sh@rp.

Dans un cas "complexe", j'abandonne la variable booléenne pour choisir une variable sur un entier. Selon si l'entier est pair ou impair, on peut effectivement avoir un comportement d'interrupteur, mais on peut en plus vérifier sur quelle occurrence de "David" le script travaille. D'une pierre, deux coups.
Avatar du membre
Nash
Administrateur du site
Administrateur du site
Messages : 4403
Enregistré le : sam. 6 nov. 2010 14:19
Localisation : 89
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par Nash »

re les gars , le post avais pas pris (juste avant coupure) mais j'avais trouvé comme ca :

les fonctions de sh@rp qui vont bien :) :
Private Function ParseBetween(ByVal Source$, ByVal Before$, ByVal After$) As String()
Dim Results As New List(Of String)
Dim T As New List(Of String)
With T
.AddRange(Regex.Split(Source, Before))
.RemoveAt(0)
For Each Item$ In T
Results.Add(Regex.Split(Item, After)(0))
Next
End With
Return Results.ToArray
End Function

Private Function ParseBetween(ByVal Source$, ByVal Before$, ByVal After$, ByVal Offset%) As String
If String.IsNullOrEmpty(Source) Then Return String.Empty
If Source.Contains(Before) = True Then
Dim Result$ = Source.Substring(Source.IndexOf(Before) + Offset)
If Result.Contains(After) = True Then
If Not String.IsNullOrEmpty(After) Then Result = Result.Substring(0, Result.IndexOf(After))
End If
Return Result
Else
Return String.Empty
End If
End Function
et l'appel :
Dim richprov As New RichTextBox
richprov.Text = IO.File.ReadAllText("d:\test.txt")

Dim str = ParseBetween((richprov.Text), "david", "david")
For Each occ In str
richprov.Text = richprov.Text.Replace("david" & occ & "david", "")
Next
Dim myWriter As StreamWriter
Dim myStream As FileStream
myStream = New FileStream(("d:\test.txt"), FileMode.Create)
myWriter = New StreamWriter(myStream)
myWriter.Write(Replace(richprov.Text, Chr(10), Environment.NewLine), RichTextBoxStreamType.PlainText)
myWriter.Close()
myStream.Close()
je sais pas si c'est propre mais ca fonctionne nikel ;)
Image
• Ryzen 9 5900x
• B550 AORUS PRO 
• RTX 3060ti phoenix 
• thermaltake core p8 tg
• 1 x SSD 500GB   PCIe4 M.2 SEA
• 32 G DDR4 3600 corsaire
• Corsaire 1000w full modulaire passive
• MasterLiquid ML240R RGB
•1 to stockage NVME.M2 PCIe
Avatar du membre
sh@rp
Membre VIP
Membre VIP
Messages : 585
Enregistré le : mar. 1 févr. 2011 13:03
Contact :
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par sh@rp »

Les fonctions ont été codées pour me simplifier le travail ....du coup tu echappes a la partie essentielle o_O : le raisonnement.

Tanpis...é_è
Le dev ne se réduit pas à du simple copier/coller de codes sources mais à une incommensurable phase d'apprentissage d'un domaine en perpétuelle évolution !
http://3dotdevcoder.blogspot.fr/
Avatar du membre
Prof
Administrateur du site
Administrateur du site
Messages : 8259
Enregistré le : lun. 5 avr. 2010 20:07
Localisation : Vosges
A remercié : 3 fois
A été remercié : 8 fois
Contact :
    unknown unknown

Re: Supprimer text dans fichier txt (dotnet)

Message par Prof »

sh@rp a écrit :Les fonctions ont été codées pour me simplifier le travail ....du coup tu echappes a la partie essentielle o_O : le raisonnement.

Tanpis...é_è

hihi tu parles comme un prof^^

Je donne cette phrase tous les ans à mes élèves :
Donne un poisson à un homme, tu le nourris pour un jour. Apprends lui à pêcher, il se nourrira toute sa vie
Règlement du forum
Toute demande d'aide ou de liens par MP est inutile !
Verrouillé