2009-03-20 14 views
2

J'ai beaucoup de fichiers texte dans un dossier. Ce que je peux faire maintenant est de lire un texte à la fois et de l'insérer dans la base de données. Ma petite application lit un fichier texte lorsque je le débogue. Donc, j'ai besoin de l'exécuter plusieurs fois pour lire tous ces fichiers texte et les importer dans la base de données.Lire plusieurs fichiers texte dans un dossier

Ma question est de savoir comment lire plusieurs fichiers texte dans un dossier à la fois. Voici mon code qui fonctionne bien, mais il ne lit qu'un seul fichier texte à la fois.

Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click 

     Dim filelocation As String 
     filelocation = "F:\txtfiles\ch25.txt" 
     Dim chid As Integer 
     chid = 25 



     'read from file' 
     Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 
     Dim vArray() As String = MyStream.ReadToEnd.Split(CChar("$")) 
     MyStream.Close() 



     Dim count As Integer 

     'insert text to table' 
     For d As Integer = 0 To vArray.Length - 1 Step 1 

      If d = vArray.Length - 1 Then 
       Exit For 
      End If 

      InsertKh(chid, d + 1, vArray(d)) 
      count = d + 1 
     Next 


     MsgBox ("Done Inserting") 

End Sub 

De toute évidence, j'ai besoin d'un moyen de faire une boucle dans un dossier et de vérifier s'il y a un fichier texte. Mais je ne peux pas le faire correctement. Quelqu'un peut-il me montrer du code ou des liens? J'utilise VB.NET, .NET 3.5

Merci beaucoup.

+0

Éditez accidentellement le fichier en essayant de copier du code. :) – BobbyShaftoe

+0

Essayez-vous d'optimiser la vitesse de votre code? (Threading) Ou essayez-vous de rendre votre code plus générique en permettant à tous les fichiers d'être traités en un seul passage? (Directory.GetFiles) –

Répondre

8

Regardez dans Directory.GetFiles.

Vous pouvez l'appeler avec un modèle de recherche spécifié comme "* .txt" pour trouver un type de fichier spécifique. Quelque chose comme ceci:

Dim fileEntries As String() = Directory.GetFiles(targetDirectory,"*.txt") 
    ' Process the list of .txt files found in the directory. ' 
    Dim fileName As String 
    For Each fileName In fileEntries 
     ProcessFile(fileName) 
1

Je voudrais examiner en utilisant le ThreadPool.QueueUserWorkItem. Fondamentalement, vous aurez envie de lire tous les fichiers dans le dossier et mettre en file d'attente chaque fichier pour le traitement. Vous devrez construire une méthode qui peut traiter chaque fichier individuellement comme sa propre sous-routine.

+0

Très bien, je lis le lien que vous avez posté. Merci. –

+0

J'ai peut-être pris votre question à l'étape suivante. Ma recommandation est en ce qui concerne la multi-threading la lecture de vos fichiers pour améliorer les performances. – bendewey

+0

@bendewey, je suis d'accord, je pense que sa question portait sur la fonctionnalité, pas sur la performance. –

1
Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click 

Dim di As New DirectoryInfo("F:\txtfiles") 
Dim s As String 

ForEach s In di.GetFiles("*.txt") 
    Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click 
     Dim filelocation As String 
     filelocation = s ''"F:\txtfiles\ch25.txt" 
     Dim chid As Integer 
     chid = 25 



     'read from file' 
     Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 
     Dim vArray() As String = MyStream.ReadToEnd.Split(CChar("$")) 
     MyStream.Close() 



     Dim count As Integer 

     'insert text to table' 
     For d As Integer = 0 To vArray.Length - 1 Step 1 

      If d = vArray.Length - 1 Then 
       Exit For 
      End If 

      InsertKh(chid, d + 1, vArray(d)) 
      count = d + 1 
     Next 


     '' MsgBox ("Done Inserting") 


    End Sub 
1

Utilisez la méthode Directory.GetFiles pour trouver tous les fichiers texte dans un dossier:

Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click 

    Dim files As String() = System.IO.Directory("F:\txtfiles\", "*.txt") 

    Dim count As Integer = 0 

    ForEach filelocation As String in files 

     Dim chid As Integer = 25 

     'read from file' 
     Dim MyStream As New StreamReader(filelocation) 
     Dim vArray() As String = MyStream.ReadToEnd.Split("$"C) 
     MyStream.Close() 

     'insert text to table' 
     For d As Integer = 0 To vArray.Length - 2 
     InsertKh(chid, d + 1, vArray(d)) 
     count = count + 1 
     Next 

    Next 

    MsgBox ("Done Inserting") 

End Sub 

Remarques:
En utilisant Path.Combine lorsque le second paramètre est une chemin complet renvoie juste le deuxième paramètre, donc c'est inutile dans ce cas. Au lieu de convertir une chaîne en un caractère, vous pouvez écrire un littéral char comme suit: "$"C.
Au lieu de sortir de la boucle lorsque vous êtes au dernier élément, faites en sorte que la boucle termine un élément plus tôt.
Comme vous avez des boucles imbriquées, vous devez augmenter le compteur dans la boucle au lieu de lui affecter la variable de boucle, sinon vous n'obtiendrez que le nombre d'éléments dans le dernier fichier. (Si vous utilisez réellement le compteur pour quelque chose.)

Questions connexes