Extraire plusieurs partie dans un fichier text

Résolu
meherr - 21 déc. 2012 à 10:43
 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.

20 réponses

Utilisateur anonyme
25 déc. 2012 à 11:51
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
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 déc. 2012 à 13:48
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.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
21 déc. 2012 à 15:07
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
0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 déc. 2012 à 16:33
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.
0
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é ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 déc. 2012 à 17:02
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 déc. 2012 à 17:04
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.
0
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 :)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 déc. 2012 à 20:08
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 déc. 2012 à 20:36
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.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
22 déc. 2012 à 20:16
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
0
Utilisateur anonyme
23 déc. 2012 à 15:52
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 déc. 2012 à 19:04
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.
0
Utilisateur anonyme
23 déc. 2012 à 20:35
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.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 déc. 2012 à 21:55
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.
0
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]
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 déc. 2012 à 16:58
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.
0
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]
0
Ça marche exactement comme je le souhaite merci banana32 , ucfoutu et les autres
Je vous souhaite joyeux noël à tous.
0
Rejoignez-nous