@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.
