Extraire plusieurs partie dans un fichier text [Résolu]

- - Dernière réponse :  meherr - 25 déc. 2012 à 12:40
Bonjour,
j'ai un fichier text qui contient a peu prés 30.000 lignes. J'aimerais bien récupérer tous les parties de ce texte qui commencent par le mot "debut" et finissent par "fin" c'est à dire a chaque fois qu'il trouve le mot "debut" il capture tout ce qui va suivre jusqu’au mot "fin" et continue de parcourir le fichier jusqu’à ce qu'il n y ait plus de de mot "debut".
le résultat je veux l'enregistrer dans un deuxième fichier.
Si c'est faisable en VB.net c'est l'ideal sinon on m'as conseillé de chercher s'il existe une ligne de code sous Shell
Merci d'avance.
Afficher la suite 

20 réponses

Meilleure réponse
3
Merci
Bonjour,
Les transformations (tolist) sont coûteuses en ressources, fais plutôt comme ceci :
Using lecture As New IO.StreamReader("in.txt")
    Using ecriture As New IO.StreamWriter("out.txt")
        Dim ligne() As String = lecture.ReadToEnd.Split(New String() {"debut", "fin"}, StringSplitOptions.RemoveEmptyEntries)
        For i As Integer = 1 To ligne.Length - 1 Step 2
            ecriture.WriteLine(ligne(i))
        Next
    End Using
End Using

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 133 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Bonjour,
Tu poses ta question dans :
Accueil > Forum > Visual Basic 6

en précisant :
Si c'est faisable en VB.net c'est l'ideal

On attendra donc que tu te décides !

Quant à :
sinon on m'as conseillé de chercher s'il existe une ligne de code sous Shell

Sans le moindre commentaire à l'égard de "celui" (le "on") qui a émis un tel conseil. !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
45
0
Merci
Bonjour

en net peut etre ainsi
Private Sub Proceed(ByVal pathfilein As String, ByVal pathfileout As String)
        Dim listin As New List(Of String)
        Dim listout As New List(Of String)
        Dim flag As Boolean
        Try
            flag = False
            listin = System.IO.File.ReadAllLines(pathfilein).ToList
            For iter As Int32 = 0 To listin.Count - 1
                If listin(iter).StartsWith("début") Then
                    flag = True
                End If
                If flag Then
                    listout.Add(listin(iter))
                End If
                If listin(iter).EndsWith("fin") And Not listin(iter + 1).StartsWith("début") Then
                    flag = False
                End If
            Next
            IO.File.WriteAllLines(pathfileout, listout.ToArray)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
Commenter la réponse de cs_ShayW
0
Merci
Merci pour ton aide , j'ai crée deux fichier pour tester mais rien ne change !! j'ai localiser l'erreur grace aux points d'arret lors de l'execution , je me rend comte que a cette ligne la:

If listin(iter).EndsWith("fin") And Not listin(iter + 1).StartsWith("début") Then

il affiche le message d'erreur suivant :

[b]L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
Nom du paramètre : index
/b
Que dois-je faire ? merci
Commenter la réponse de meherr
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
For iter As Int32 = 0 To listin.Count - 1
et
And Not listin(iter + 1)
l'erreur est toute vue, non ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
For iter As Int32 = 0 To listin.Count - 1 ça parait logique pour parcourir le fichier
If listin(iter).EndsWith("fin") And Not listin(iter + 1).StartsWith("début") ça parait logique aussi j'ai même enlever le "+1" et elle a afficher le même texte dans le deuxième fichier
Ou est l'erreur si vous l'avez trouvé ?
Commenter la réponse de meherr
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
For iter As Int32 = 0 To listin.Count - 1 ça parait logique pour parcourir le fichier

On prend des bûchettes, alors ===>>
L'index commence à 0 ===>> pour par exemple 2 articles ===>> index 0 et index 1
(alors que le Count 2, donc le Count-1 1 ==>> si iter = count-1 ==>> iter = 1 et iter + 1 = 2 b===>> 2 est bel et bien inexistant !

CQFD
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Maintenant, ce qui est dit est si l'index commence bien à 0.
S'il commence à 1 et non à 0, l'erreur est alors dans ce que je mets en rouge ===>>
For iter As Int32 = 0 To listin.Count - 1
(toujours avec des bûchettes).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
je me rend compte d'une autre condition
Le text ne comment pas obligatoirement pour debut et ne finit pas aussi par fin
exemple de chaine :
salut debut valeur 1 fin blabla debut valeur 2 et 3 fin bla blaaaa debut valeur 1+2+3 fin sdfhsfd

dans le deuxième fichier il doit afficher seulement ce qui est en gras !
en plus je vais parcourir un fichier de quelques dizaines de millier de lignes
Je veux donc un code qui tient en compte touts ces facteurs
Merci d'avance :)
Commenter la réponse de meherr
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
je me rend compte d'une autre condition


Nous en étions pourtant au 9ème message.
Nous nous rendons alors compte, en ce qui nous concerne, de ce qu'il sera plus prudent d'attendre que tu aies fini de terminer de te rendre compte de ce que tu veux.
Quand tu auras terminé de t'en rendre compte : reviens et dit tout, hein ...

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Même avec l'exemple que tu viens de donner (en te "rendant compte d'une autre condition") : les choses ne sont toujours pas vraiment claires ni précises/complètes. J'attends la fin de ta réflexion pour te démontrer cette imprécision.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
45
0
Merci
Bonsoir

j'avoue je n'ai pas testé mon code
le problème s'avère à la derniere ligne du fichier
maintenant cela doit marcher
Private Sub Proceed(ByVal pathfilein As String, ByVal pathfileout As String)
        Dim listin As New List(Of String)
        Dim listout As New List(Of String)
        Dim flag As Boolean
        Try
            flag = False
            listin = System.IO.File.ReadAllLines(pathfilein).ToList
            For iter As Int32 = 0 To listin.Count - 1
                If listin(iter).StartsWith("début") Then
                    flag = True
                End If
                If flag Then
                    listout.Add(listin(iter))
                End If
                If listin(iter).EndsWith("fin") AndAlso (iter + 1) < listin.Count AndAlso Not listin(iter + 1).StartsWith("début") Then
                    flag = False
                End If
            Next
            IO.File.WriteAllLines(pathfileout, listout.ToArray)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub
Commenter la réponse de cs_ShayW
0
Merci
Bonjour,

Ou alors simplement 'spliter' la chaîne :
Dim test As String = "salut debut valeur 1 fin blabla debut valeur 2 et 3 fin bla blaaaa debut valeur 1+2+3 fin sdfhsfd "
Dim tableau As String() = test.Split(New String() {"debut", "fin"}, StringSplitOptions.RemoveEmptyEntries)
'affichage
For i As Integer = 0 To tableau.Length - 1
  If i Mod 2 = 1 Then
     Debug.Print(tableau(i))
  End If
Next
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Coucou, Banana32,
Pour mémoire :
Même avec l'exemple que tu viens de donner (en te "rendant compte d'une autre condition") : les choses ne sont toujours pas vraiment claires ni précises/complètes. J'attends la fin de ta réflexion pour te démontrer cette imprécision.

C'est toujours d'actualité (tant que toutes les précisions n'auront pas été apportées). Hé oui
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Bonsoir ucfoutu,

Dans la nouvelle mouture du site, il faudra peut-être prévoir lors du post d'un nouveau sujet, une sorte de formulaire 'intelligent' ou pré-formulaire.
L'utilisateur pourrait être guidé sur la formulation de sa question. On éviterait peut-être ainsi 90% des posts: incompréhensibles, titres peu explicites, mauvaises sections, balises de coloration absentes, validation inexistantes etc...

Bonnes fêtes à toi et ta famille.
Commenter la réponse de Utilisateur anonyme
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Bonnes fêtes à toi et à ta famille aussi.
Tiens : un petit cadeau de Noël (fait en réalité au demandeur, hein ...) le raisonnement ne saurait par exemple être le même si, entre début et fin, peut malencontreusement exister la chaîne debut, ou la chaine fin (ou les deux).
(Ah ! la précision ...)


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
Re bonjour les amis , j'ai fait une fusion entre tous vos propositions pour obtenir une fonction qui est la suivante :
chemin/text_in.txt contient la chaîne à extraire
chemin/text_out.txt est un fichier vide à remplir
(banana32 votre code marche bien mais juste j'ai changé la variable test par le contenu du fichier)


Dim listin As New List(Of String)
listin = System.IO.File.ReadAllLines("chemin\text_in.txt").ToList

Dim monStreamWriter As StreamWriter = New StreamWriter("chemin\text_out.txt")
Dim tableau As String() = listin.ToString.Split(New String() {"debut", "fin"}, StringSplitOptions.RemoveEmptyEntries)

For i As Integer = 0 To tableau.Length - 1

monStreamWriter.WriteLine(tableau(i))

Next
monStreamWriter.Close()



Mon erreur est dans la ligne en rouge car le tableau ne prend pas les chaines nécessaire.


Et le deuxiéme fichier contiendra donc cette chaine la : System.Collections.Generic.List`1[System.String]
Commenter la réponse de meherr
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
209
0
Merci
Ah ! Voilà maintenant du code qui n'est plus du :
Forum > Visual Basic 6

Tu développes finalement dans quel langage ?


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
Commenter la réponse de ucfoutu
0
Merci
En VB.net

dim chaine as String
Dim tableau As String() = chaine.Split(New String() {"debut", "fin"}, StringSplitOptions.RemoveEmptyEntries)

le tableau contient ce que j'en ai besoin , mais au lieu de déclarer "chaine" je veux qu'il parcour tout le fichier alors j'ai fais :

Dim listin As New List(Of String)
listin = System.IO.File.ReadAllLines("chemin\text_in.txt").ToList

Pour la parcourir j'ai fait
Dim tableau As String() = listin.ToString.Split(New String() {"debut", "fin"}, StringSplitOptions.RemoveEmptyEntries)
mais le tableau affiche : System.Collections.Generic.List`1[System.String]
Commenter la réponse de meherr
0
Merci
Ça marche exactement comme je le souhaite merci banana32 , ucfoutu et les autres
Je vous souhaite joyeux noël à tous.
Commenter la réponse de meherr