2009-07-17 5 views
2

Je dois lire ligne par ligne un fichier journal. Il s'agit d'environ 6MB et 40000 lignes au total. Mais après avoir testé mon programme, je découvre que ce fichier journal n'est seulement délimité que par le caractère LF. Donc, je ne peux pas utiliser la méthode Readline de StreamReader classeComment lire chaque ligne dans un fichier qui est délimité par LF seulement?

Comment puis-je résoudre ce problème?

edit: J'ai essayé d'utiliser Text Reader, mais mon programme encore n'a pas fonctionné:

using (TextReader sr = new StreamReader(strPath, Encoding.Unicode)) 
      { 


       sr.ReadLine(); //ignore three first lines of log file 
       sr.ReadLine(); 
       sr.ReadLine(); 

       int count = 0; //number of read line 
       string strLine; 
       while (sr.Peek()!=0) 
       { 
        strLine = sr.ReadLine(); 
        if (strLine.Trim() != "") 
        { 
         InsertData(strLine); 
         count++; 
        } 
       } 

       return count; 
      } 

Répondre

4

Est-ce que File.ReadAllLines (fileName) ne se charge pas correctement les fichiers avec les extrémités de ligne LF? Utilisez ceci si vous avez besoin du fichier entier - j'ai vu un site indiquant qu'il est plus lent qu'une autre méthode, mais ce n'est pas le cas si vous lui passez le codage correct (par défaut UTF-8), et c'est aussi propre que possible.

Éditer: C'est le cas. Et si vous avez besoin de streaming, TextReader.ReadLine() gère correctement les extrémités de ligne Unix.

Modifier à nouveau: StreamReader le fait également. Avez-vous vérifié la documentation et supposé qu'elle ne gérera pas les extrémités de ligne LF? Je regarde dans Reflector et il semble que c'est une bonne routine de manipulation.

+0

le fichier est gros, en fait. et je dois lire ligne par ligne pour post-traitement – Vimvq1987

+0

@ Vimvq1987 (4 ans plus tard ...) mais comment cela a-t-il résolu votre problème? IOW, si cela est correct, votre code a échoué pour une autre raison. Par curiosité (et si vous vous en souvenez) c'était quoi? –

8

TextReader.ReadLine gère déjà les lignes terminées par \n.

De the docs:

Une ligne est définie comme une séquence de caractères suivis par un chariot retour (0x000D), une alimentation de ligne (0x000A), un retour de chariot suivi par une ligne alimentation , Environment.NewLine ou la fin du marqueur de flux. La chaîne renvoyée ne contient pas le retour chariot de terminaison et/ou le saut de ligne . La valeur renvoyée est une référence null (Nothing dans Visual Basic) si la fin du flux d'entrée a été atteinte.

Donc, fondamentalement, ça devrait aller. (Je l'ai parlé TextReader plutôt que StreamReader parce que c'est là que la méthode est déclarée -. Évidemment il fonctionne toujours avec un StreamReader)

Si vous voulez itérer lignes facilement (et potentiellement utiliser LINQ contre le fichier journal) vous pouvez trouver ma classe LineReader dans MiscUtil utile. Il enveloppe essentiellement les appels à ReadLine() dans un itérateur. Ainsi, par exemple, vous pouvez faire:

var query = from file in Directory.GetFiles("logs") 
      from line in new LineReader(file) 
      where !line.StartsWith("DEBUG") 
      select line; 

foreach (string line in query) 
{ 
    // ... 
} 

Tout le streaming :)

+0

mon programme ne fonctionnait toujours pas. Je ne sais pas ce qui ne va pas :( – Vimvq1987

0

je l'aurais deviné \ LF (\ n) serait bien (alors que \ CR (\ r) peut causer des problèmes -seulement).

Vous pouvez lire chaque ligne un caractère à la fois et le traiter lorsque vous lisez le terminateur. Après le profilage, si cela est trop lent, vous pouvez utiliser la mise en mémoire tampon de l'application avec read ([]).

Mais essayez d'abord un personnage simple à la fois!

+0

Il existe des fonctions rapides qui implémentent cette fonctionnalité: essayez d'abord celles-ci, car elles sont rapides, courtes, expressives et standardisées. –

0

Ou vous pouvez utiliser la méthode Readblock et analyser les lignes vous-même

Questions connexes