Chercher un mot dans les fichiers d'un dossier
Résolu
flamouth1
Messages postés
10
Statut
Membre
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour, Débutant en visual basic, je cherche à réaliser une application pour mon magasin qui chercherai dans le dossier préalablement choisit, un code contenu dans un des fichiers .txt.
Pour le moment j'ai une form avec:
-un bouton source(localiser le fichier) et charge dans la richtextbox
-un bouton rechercher(cherche le code précisé dans la textbox) et surligne dans la richtextbox
-un bouton Sauvegarder(pour sauvegarder la richtextbox dans le fichier).
Ca fonctionne bien mais pour ne pas avoir à chercher dans tous les fichiers du dossier.
J'ai donc rajouter un bouton pour sélectionner le dossier. Et la je ne trouve rien que je comprenne le fonctionnement sur internet.
Pour le test, mon dossier contient 3 fichiers .txt avec chacun une liste de code.
Je voudrai chercher (par exemple) le code 150234 (définit dans la textbox) et ensuite ouvrir le .txt qui contient le code dans la richtextbox.
Je pourrai donner l'ensemble de la source si cela intéresse d'autre personnes.
Merci d'avance pour votre aide.
Bonne Année :-)
Pour le moment j'ai une form avec:
-un bouton source(localiser le fichier) et charge dans la richtextbox
-un bouton rechercher(cherche le code précisé dans la textbox) et surligne dans la richtextbox
-un bouton Sauvegarder(pour sauvegarder la richtextbox dans le fichier).
Ca fonctionne bien mais pour ne pas avoir à chercher dans tous les fichiers du dossier.
J'ai donc rajouter un bouton pour sélectionner le dossier. Et la je ne trouve rien que je comprenne le fonctionnement sur internet.
Pour le test, mon dossier contient 3 fichiers .txt avec chacun une liste de code.
Je voudrai chercher (par exemple) le code 150234 (définit dans la textbox) et ensuite ouvrir le .txt qui contient le code dans la richtextbox.
Je pourrai donner l'ensemble de la source si cela intéresse d'autre personnes.
Merci d'avance pour votre aide.
Bonne Année :-)
A voir également:
- Rechercher un mot dans plusieurs fichiers txt
- Comment réduire la taille d'un fichier - Guide
- Trousseau mot de passe iphone - Guide
- Renommer plusieurs fichiers en même temps - Guide
- Comment ouvrir un fichier epub ? - Guide
- Mot de passe - Guide
10 réponses
Je suis en Application Windows Form sous visual studio 2013.
Voila mon code pour situer un peu.
Merci
Voila mon code pour situer un peu.
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim openMe As New OpenFileDialog()
Dim selectedFile As String = String.Empty
If openMe.ShowDialog() = Windows.Forms.DialogResult.OK Then
RichTextBox1.LoadFile(openMe.FileName, RichTextBoxStreamType.PlainText)
selectedFile = openMe.FileName
SourceTextbox.Text = selectedFile
Else
End If
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
System.IO.File.WriteAllText(SourceTextbox.Text, RichTextBox1.Text)
End Sub
Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged
End Sub
Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles SourceTextbox.TextChanged
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
Dim i, j As System.Int32
Dim strTexte As String = String.Empty
Dim strChaine As String = String.Empty
strTexte = RichTextBox1.Text
strChaine = SearchTextBox.Text
For i = 0 To strTexte.Length - strChaine.Length Step 1
If strTexte.Substring(i, strChaine.Length) = strChaine Then
j += 1
RichTextBox1.Select(i, strChaine.Length)
RichTextBox1.Focus()
RichTextBox1.SelectionStart = i
RichTextBox1.SelectionLength = strChaine.Length
End If
Next
End Sub
Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles SearchTextBox.TextChanged
End Sub
Private Sub Dossier_Click(sender As Object, e As EventArgs) Handles Dossier.Click
Dim selectedos As String = String.Empty
FolderBrowserDialog1.Description = "Veuillez sélectionner le dossier de recherche."
FolderBrowserDialog1.ShowNewFolderButton = False
FolderBrowserDialog1.SelectedPath = My.Computer.FileSystem.SpecialDirectories.Desktop
If FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
Dim dossier_selectionner As String = FolderBrowserDialog1.SelectedPath
selectedos = FolderBrowserDialog1.SelectedPath
DossierTextBox.Text = selectedos
Else
End If
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
End Sub
Private Sub DossierTextBox_TextChanged(sender As Object, e As EventArgs) Handles DossierTextBox.TextChanged
End Sub
End Class
Merci
Pour récupérer la liste des fichiers d'un répertoire, il faut utiliser la classe Directory et sa méthode de classe GetFiles.
https://docs.microsoft.com/fr-fr/dotnet/api/system.io.directory.getfiles?redirectedfrom=MSDN&view=netframework-4.8
Selon la surcharge tu peux spécifier un pattern à chercher et s'il faut chercher dans les sous répertoires.
Ça va te retourner un tableau avec les chemins de tous les fichiers.
Il va te falloir tous les ouvrir (avec une boucle foreach par exemple) et File.ReadAllText, et chercher si le texte contient ton code, avec la méthode Contains (attention à la casse) de string.
A chaque fois que tu trouves le code tu ajoutes le chemin du fichier dans une Liste de String, et une fois fini, tu peux afficher tous les fichier contenant ton code.
Pour ce bout de code, je ne tiens pas compte de la casse ni des accents, cédilles, etc...
Ça peut être réduit avec une requête Linq.
PS, je n'ai pas lu ton code.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
https://docs.microsoft.com/fr-fr/dotnet/api/system.io.directory.getfiles?redirectedfrom=MSDN&view=netframework-4.8
Selon la surcharge tu peux spécifier un pattern à chercher et s'il faut chercher dans les sous répertoires.
Ça va te retourner un tableau avec les chemins de tous les fichiers.
Il va te falloir tous les ouvrir (avec une boucle foreach par exemple) et File.ReadAllText, et chercher si le texte contient ton code, avec la méthode Contains (attention à la casse) de string.
A chaque fois que tu trouves le code tu ajoutes le chemin du fichier dans une Liste de String, et une fois fini, tu peux afficher tous les fichier contenant ton code.
Private Function FichiersContenantTexte(ByVal Repertoire As String, ByVal TexteATrouver As String) As List(Of String)
Dim resultat As New List(Of String)()
For Each fichier As String In Directory.GetFiles(Repertoire,"*.txt",SearchOption.TopDirectoryOnly)
If File.ReadAllText(fichier).Contains(TexteATrouver) Then
resultat.Add(fichier)
End If
Next fichier
Return resultat
End Function
Pour ce bout de code, je ne tiens pas compte de la casse ni des accents, cédilles, etc...
Ça peut être réduit avec une requête Linq.
PS, je n'ai pas lu ton code.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Ok merci c'est beaucoup plus clair pour moi. Je te tiens au jus :-)
Ps: c'est pas grave c'est brouillon pour le moment ^^.
Ps: c'est pas grave c'est brouillon pour le moment ^^.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Du coup je n'arrive pas à l'associer avec mon bouton pour lancer la recherche du code inscrit dans la textbox. Et ouvrir du coup le resultat dans la richtextbox. Je suis sur qu'il n'y aura pas de doublon.
Enfin dans l'idée c'est clair mais la pratique beaucoup moins. Je suis vraiment débutant et apprend des sources que je trouve pour satisfaire mon application.
Si tu pouvais m'aider à l'implémenter, se serai super. Sinon j'ai trouvé une solution alternative mais beaucoup moins pratique. Donc te sens pas obligé. Ca aidera aussi d'autre personne d'avoir un code complet.
Merci de ton temps en tous cas. Et bonne soirée
ps:
Et pour suite une textbox pour le code a chercher
Un bouton pour chercher (la ou j'aimerai intégré ce bout de code plus haut)
Enfin dans l'idée c'est clair mais la pratique beaucoup moins. Je suis vraiment débutant et apprend des sources que je trouve pour satisfaire mon application.
Si tu pouvais m'aider à l'implémenter, se serai super. Sinon j'ai trouvé une solution alternative mais beaucoup moins pratique. Donc te sens pas obligé. Ca aidera aussi d'autre personne d'avoir un code complet.
Merci de ton temps en tous cas. Et bonne soirée
ps:
Private Sub Dossier_Click(sender As Object, e As EventArgs) Handles Dossier.Click
Dim selectdos As String = String.Empty
FolderBrowserDialog1.Description = "Veuillez sélectionner le dossier de recherche."
FolderBrowserDialog1.ShowNewFolderButton = False
FolderBrowserDialog1.SelectedPath = My.Computer.FileSystem.SpecialDirectories.Desktop
If FolderBrowserDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
Dim dossier_selectionner As String = FolderBrowserDialog1.SelectedPath
selectdos = FolderBrowserDialog1.SelectedPath
DossierTextBox.Text = selectdos
Else
End If
End Sub
Et pour suite une textbox pour le code a chercher
Un bouton pour chercher (la ou j'aimerai intégré ce bout de code plus haut)
Si tu es sur qu'il n'y aura pas de doublon
Private Function FichiersContenantTexte(ByVal Repertoire As String, ByVal TexteATrouver As String) As String
For Each fichier As String In Directory.GetFiles(Repertoire,"*.txt",SearchOption.TopDirectoryOnly)
If File.ReadAllText(fichier).Contains(TexteATrouver) Then
Return fichier
End If
Next fichier
Return String.Empty 's'il n'y a pas d'occurrence ça retourne une chaine vide
End Function
Salut, du coup c'est bon ça fonctionne, merci beaucoup. Juste une question pour le premier code. Quand on à des doublons par exemple, il m'affiche les fichiers dans ma listbox. Mais comment puis-je faire pour les afficher respectivement dans plusieurs richtextbox. Merci encore pour ton aide.
Tu as plusieurs possibilités:
- créer dynamiquement autant de richtextbox qu'il y a de fichiers, mais ça risque de charger ton interface
- faire des onglets dynamiquement, un par fichier
- utiliser une listbox, ou un combobox et afficher le fichier sélectionné
- tous les concatèner dans un seul richtextbox
- ....
Une dernière question, Voila un bout du code:
Là, il m'affiche que le 1er résultat pour le moment.
Il faut lire <fichier> et traiter chaque ligne j'imagine.
Mais quel est la syntaxe. Je n'y arrive pas. Merci
For Each fichiers As String In Directory.GetFiles(Repertoire, "*.txt") If File.ReadAllText(fichiers).Contains(findtxt) Then resultat.Add(fichiers) ListBox1.Items.Add(fichiers) RichTextBox1.LoadFile(fichiers, RichTextBoxStreamType.PlainText) End If
Là, il m'affiche que le 1er résultat pour le moment.
Il faut lire <fichier> et traiter chaque ligne j'imagine.
Mais quel est la syntaxe. Je n'y arrive pas. Merci
Le premier choix je te proposer de les créer dynamiquement les richtexbox.
C'est ce que j'ai codé
C'est ce que j'ai codé
Private Sub AfficheLesFichiers()
Dim lesFichiers As List(Of String) = FichiersContenantTexte("C:\temp", "toto")
For i As Integer = 0 To lesFichiers.Count - 1
Dim r As New RichTextBox()
r.Location = New System.Drawing.Point(i * 50, i * 50) 'pose les controles en diagonale, tous les 50, à toi de gérer ça mieux
r.Name = "rtbFichier" & (i+1).ToString()'c'est pas forcement nécessaire
r.Size = New System.Drawing.Size(100, 100)
r.Text = File.ReadAllText(lesFichiers(i))
Me.Controls.Add(r)
r.BringToFront()'place le controle par dessus les autres, il faut le faire après l'avoir ajouté à la form
Next i
End Sub
Tous comptes fait c'est trop brouillon en dynamique, du coup j'ai fait une condition pour chaque richtexbox, J'utilisais "fichiers" au lieu de "resultat" et évidement ça ne fonctionnait pas.
Voila le code terminé pour ceux qui rechercherai la même chose.
Merci Whismeril pour ton aide.
Voila le code terminé pour ceux qui rechercherai la même chose.
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
TextBox1.Clear()
TextBox2.Clear()
TextBox3.Clear()
TextBox4.Clear()
RichTextBox1.Clear()
RichTextBox2.Clear()
RichTextBox3.Clear()
RichTextBox4.Clear()
Dim Repertoire As String = String.Empty
Dim findtxt As String = String.Empty
Dim resultat As New List(Of String)
Repertoire = DossierTextBox.Text
findtxt = FindTextBox.Text
For Each fichiers As String In Directory.GetFiles(Repertoire, "*.txt")
If File.ReadAllText(fichiers).Contains(findtxt) Then
resultat.Add(fichiers)
End If
Next fichiers
'1
If resultat.Count = 1 Then
TextBox1.Text = resultat.Item(0)
RichTextBox1.LoadFile(TextBox1.Text, RichTextBoxStreamType.PlainText)
End If
'2
If resultat.Count = 2 Then
TextBox1.Text = resultat.Item(1)
TextBox2.Text = resultat.Item(0)
RichTextBox1.LoadFile(TextBox1.Text, RichTextBoxStreamType.PlainText)
RichTextBox2.LoadFile(TextBox2.Text, RichTextBoxStreamType.PlainText)
End If
'3
If resultat.Count = 3 Then
TextBox1.Text = resultat.Item(2)
TextBox2.Text = resultat.Item(1)
TextBox3.Text = resultat.Item(0)
RichTextBox1.LoadFile(TextBox1.Text, RichTextBoxStreamType.PlainText)
RichTextBox2.LoadFile(TextBox2.Text, RichTextBoxStreamType.PlainText)
RichTextBox3.LoadFile(TextBox3.Text, RichTextBoxStreamType.PlainText)
End If
'4
If resultat.Count = 4 Then
TextBox1.Text = resultat.Item(3)
TextBox2.Text = resultat.Item(2)
TextBox3.Text = resultat.Item(1)
TextBox4.Text = resultat.Item(0)
RichTextBox1.LoadFile(TextBox1.Text, RichTextBoxStreamType.PlainText)
RichTextBox2.LoadFile(TextBox2.Text, RichTextBoxStreamType.PlainText)
RichTextBox3.LoadFile(TextBox3.Text, RichTextBoxStreamType.PlainText)
RichTextBox4.LoadFile(TextBox4.Text, RichTextBoxStreamType.PlainText)
End If
End Sub
Merci Whismeril pour ton aide.