2009-04-27 4 views
1

Je suis vraiment novice en C#. J'ai besoin d'ouvrir un tas de fichiers de code sous un répertoire et d'obtenir des lignes particulières qui contiennent des chaînes correspondantes. C'est un problème simple, je peux ouvrir les fichiers un par un en utilisant un lecteur de flux, puis en les analysant ligne par ligne. Je me demandais s'il y avait une façon plus efficace de faire la même chose. Comme je suis sous l'impression que le lecteur de flux et la lecture ligne par ligne serait une opération lourde.C# lire le contenu du fichier et trouver des chaînes

Répondre

0

Si vous devez examiner tout le contenu d'un fichier, vous devez lire chaque ligne. ReadLine() est une bonne méthode.

Vous pouvez lire l'intégralité du contenu du fichier à la fois, en utilisant StreamReader.ReadToEnd()

1

File.ReadAllLines() vous donnera un tableau contenant chaque ligne dans le fichier. Cela peut être plus de travail si vous êtes en mesure d'arrêter de lire à mi-chemin dans un fichier. Si ce n'est pas le cas, cela pourrait vous faire gagner un peu de temps en IO (moins d'appels individuels d'E/S, ce n'est qu'une supposition).

Si vous êtes vraiment inquiet, utilisez un profileur ou écrivez un benchmark. Sinon, utilisez la méthode la plus facile à lire.

0

La méthode ReadToEnd() est en effet efficace en termes de LoC (lignes de code), mais si vous êtes préoccupé par les performances, vous pouvez être prudent car elle charge en fait tout le contenu du fichier dans la mémoire (chaîne). Si la taille du fichier est assez grande, vous obtiendrez certainement un coup sur la performance.

5

Il y a quelques bons messages déjà sur la façon d'obtenir les lignes du fichier, donc j'ai pensé que je voudrais ajouter un peu d'efficacité. Quelques personnes ont mentionné la méthode File.ReadAllLines(). Cette méthode est problématique du point de vue de l'efficacité car elle va lire le fichier entier en mémoire à la fois. De plus, il utilise un tableau comme stockage qui nécessite de la mémoire contiguë. Si le fichier est suffisamment grand, cela causera des problèmes.

Une méthode plus efficace pour lire les fichiers consiste à utiliser la méthode StreamReader.ReadLine à plusieurs reprises. Il va retourner les lignes une à la fois et vous avez seulement besoin de garder les lignes qui vous intéressent en mémoire. Il est également relativement facile de transformer ceci en un itérateur évalué en délai.

public static IEnumerable<string> ReadLinesEnumerable(string path) { 
    using (var reader = new StreamReader(path)) { 
    var line = reader.ReadLine(); 
    while (line != null) { 
     yield return line; 
     line = reader.ReadLine(); 
    } 
    } 
} 

En termes de LINQ. Vous pouvez utiliser LINQ pour faire correspondre à la fois les ReadAllLines et la méthode ReadLinesEnumerable car tous deux retournent un type de données énumérable. Par exemple

var query = from line in ReadLinesEnumerable(@"c:\some\path\file.txt") 
      where Regex.IsMatch(line, @"^(\d)+.*$") 
      select line; 
+0

Ceci est une excellente façon de le faire. –