2010-04-25 6 views
3

J'ai un fichier texte qui contient environ 100000 articles. La structure du fichier est:Comment ouvrir un gros fichier texte en C#

 
.Document ID 42944-YEAR:5 
.Date 03\08\11 
.Cat political 
Article Content 1 

.Document ID 42945-YEAR:5 
.Date 03\08\11 
.Cat political 
Article Content 2 

Je veux ouvrir ce fichier dans C# pour le traitement ligne par ligne. J'ai essayé ce code:

String[] FileLines = File.ReadAllText(
        TB_SourceFile.Text).Split(Environment.NewLine.ToCharArray()); 

Mais il dit:

exception de type 'System.OutOfMemoryException' a été jeté .

La question est Comment puis-je ouvrir ce fichier et le lire ligne par ligne.

  • Taille du fichier: 564 Mo (591,886,626 octets)
  • Encodage de fichier: UTF-8
  • contient des caractères Unicode.

Répondre

8

Vous pouvez ouvrir le fichier et read it as a stream au lieu de tout charger en une seule fois.

De MSDN:

using System; 
using System.IO; 

class Test 
{ 
    public static void Main() 
    { 
     try 
     { 
      // Create an instance of StreamReader to read from a file. 
      // The using statement also closes the StreamReader. 
      using (StreamReader sr = new StreamReader("TestFile.txt")) 
      { 
       String line; 
       // Read and display lines from the file until the end of 
       // the file is reached. 
       while ((line = sr.ReadLine()) != null) 
       { 
        Console.WriteLine(line); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      // Let the user know what went wrong. 
      Console.WriteLine("The file could not be read:"); 
      Console.WriteLine(e.Message); 
     } 
    } 
} 
10

Votre fichier est trop volumineux pour être lu en mémoire en une seule fois, comme File.ReadAllText essaie de faire. Vous devriez plutôt lire le fichier ligne par ligne.

Adapté de MSDN:

string line; 
// Read the file and display it line by line. 
using (StreamReader file = new StreamReader(@"c:\yourfile.txt")) 
{ 
    while ((line = file.ReadLine()) != null) 
    {  
     Console.WriteLine(line); 
     // do your processing on each line here 
    } 
} 

De cette façon, pas plus qu'une seule ligne du fichier est en mémoire à un moment donné.

2

Quelque chose comme ceci:

using (var fileStream = File.OpenText(@"path to file")) 
{ 
    do 
    { 
     var fileLine = fileStream.ReadLine(); 
     // process fileLine here 

    } while (!fileStream.EndOfStream); 
} 

Questions connexes