Chercher un mot dans les fichiers d'un dossier

Résolu/Fermé
flamouth1 Messages postés 10 Date d'inscription dimanche 1 janvier 2017 Statut Membre Dernière intervention 10 janvier 2017 - 2 janv. 2017 à 16:30
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 - 8 janv. 2017 à 19:20
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 :-)



10 réponses

Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
2 janv. 2017 à 16:34
Bonjour,
quel VB?
  • VBS
  • VBA
    • Word
    • Excel
    • Access
    • Powerpoint
    • Autre
  • VB6
  • VB.Net
    • Winform
    • WPF


0
flamouth1 Messages postés 10 Date d'inscription dimanche 1 janvier 2017 Statut Membre Dernière intervention 10 janvier 2017
2 janv. 2017 à 16:52
Je suis en Application Windows Form sous visual studio 2013.
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
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
Modifié par Whismeril le 2/01/2017 à 17:20
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.
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
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
2 janv. 2017 à 17:21
Ha tiens, y'a un bogue dans la coloration syntaxique.
0
flamouth1 Messages postés 10 Date d'inscription dimanche 1 janvier 2017 Statut Membre Dernière intervention 10 janvier 2017
2 janv. 2017 à 17:26
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 ^^.
0

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

Posez votre question
flamouth1 Messages postés 10 Date d'inscription dimanche 1 janvier 2017 Statut Membre Dernière intervention 10 janvier 2017
2 janv. 2017 à 23:04
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:
 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)
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
2 janv. 2017 à 23:32
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



0
flamouth1 Messages postés 10 Date d'inscription dimanche 1 janvier 2017 Statut Membre Dernière intervention 10 janvier 2017
3 janv. 2017 à 22:24
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.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
3 janv. 2017 à 23:24
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
  • ....

0
flamouth1 Messages postés 10 Date d'inscription dimanche 1 janvier 2017 Statut Membre Dernière intervention 10 janvier 2017
4 janv. 2017 à 22:10
Une dernière question, Voila un bout du code:
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
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
4 janv. 2017 à 23:14
oui, mais ça dépend d'abord de comment tu imagines l'afficher....
Je t'ai proposé quelques options, si tu en préfères une autre c'est ton choix, mais chaque type d'affichage aura un code particulier.

Donc commence par choisir ce que tu veux obtenir.
0
Flamouth2 > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
5 janv. 2017 à 13:01
Excuse moi. Oui je te l'ai pas dit. Le 1er choix. J'ai créé 3 richtextbox pour tester. Je n'arrive qu'à récupérer qu'une ligne de liste de string.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
5 janv. 2017 à 19:02
Le premier choix je te proposer de les créer dynamiquement les richtexbox.
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

0
flamouth1 Messages postés 10 Date d'inscription dimanche 1 janvier 2017 Statut Membre Dernière intervention 10 janvier 2017
Modifié par flamouth1 le 8/01/2017 à 18:25
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.
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.
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
8 janv. 2017 à 19:20
'est trop brouillon en dynamique
je t'avais dit
mais ça risque de charger ton interface


Pour moi le meilleur rapport ergonomie/simplicité de code est la listeBox (ou le combobox) ou l'on sélectionne quel fichier afficher dans un seul et unique RichTextBox
0