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.
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
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.
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
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.
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é ?
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.
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.
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 1fin blabla debut valeur 2 et 3fin bla blaaaa debutvaleur 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 :)
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.
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.
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
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
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.
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 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.
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]
________________________
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.
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]