2011-09-02 5 views
1

Comment diviser un seul fichier texte de 1000 lignes en plusieurs fichiers plus petits, par exemple de 300 lignes chacun? S'il vous plaît gardez à l'esprit que le fichier d'origine peut avoir plus ou moins de mille lignes.C# comment diviser un fichier texte dans plusieurs fichiers

file1.txt 300 lines -> rest 
file2.txt 300 lines -> rest 
file3.txt 300 lines -> rest 
file4.txt 100 lines 

J'ai essayé ce qui suit, mais cela ne fonctionne pas.

int counter = 0; 
string line; 

string lineoutput = (current_dir + "\\" + DateTime.Now.ToString("HHmmss") + ".txt"); 

System.IO.StreamReader inputfile; 

inputfile = new System.IO.StreamReader(new_path); 
while ((line = inputfile.ReadLine()) != null) 
{ 
    System.IO.StreamWriter file = new System.IO.StreamWriter(current_dir + "\\" + DateTime.Now.ToString("HHmmss") + ".txt", true); 

    string _replaceBackspace = ReplaceBackspace(read_file.ReadLine().ToLower()); 

    using (StreamWriter writer = new StreamWriter(lineoutput, true)) 
    { 
     if (counter == 5000) 
     { 
      counter = 0; 
      lineoutput = (current_dir + "\\" + DateTime.Now.ToString("HHmmss") + ".txt"); 
     } 
     writer.WriteLine(line.ToLower()); 
    } 
    counter++; 
} 
+0

C'est ce que mon exemple fait. C'est la raison pour laquelle: "if (reader.EndOfStream) break;" – bigtlb

Répondre

6
string baseName = current_dir + "\\" + DateTime.Now.ToString("HHmmss") + "."; 

StreamWriter writer = null; 
try 
{ 
    using (StreamReader inputfile = new System.IO.StreamReader(new_path)) 
    { 
     int count = 0; 
     string line; 
     while ((line = inputfile.ReadLine()) != null) 
     { 

      if (writer == null || count > 300) 
      { 
       if (writer != null) 
       { 
        writer.Close(); 
        writer = null; 
       } 

       writer = new System.IO.StreamWriter(baseName + count.ToString() + ".txt", true); 

       count = 0; 
      } 

      writer.WriteLine(line.ToLower()); 

      ++count; 
     } 
    } 
} 
finally 
{ 
    if (writer != null) 
     writer.Close(); 
} 
5

Boucle sur File.ReadLines(path) et écrire chaque ligne à un StreamWriter. Gardez un compteur et, chaque fois qu'il atteint 300, fermez le StreamWriter et ouvrez-en un nouveau.

1

En plus SLaks répondent, vous pouvez aussi le faire en utilisant les méthodes d'extension Skip et Take dans System.Linq

string[] ss = File.ReadAllLines(@"path to the file"); 

int cycle = 1; 
int chunksize = 300; 

var chunk = ss.Take(chunksize); 
var rem = ss.Skip(chunksize); 

while (chunk.Take(1).Count() > 0) 
{ 
    string filename = "file" + cycle.ToString() + ".txt"; 
    using (StreamWriter sw = new StreamWriter(filename)) 
    { 
     foreach(string line in chunk) 
     { 
      sw.WriteLine(line); 
     } 
    } 
    chunk = rem.Take(chunksize); 
    rem = rem.Skip(chunksize); 
    cycle++; 
} 
+0

Il m'a fallu plus de dix heures pour le faire fonctionner, merci. –

6

Simplest cas:

 var reader = File.OpenText(infile); 
     string outFileName = "file{0}.txt"; 
     int outFileNumber = 1; 
     const int MAX_LINES = 300; 
     while (!reader.EndOfStream) 
     { 
      var writer = File.CreateText(string.Format(outFileName, outFileNumber++)); 
      for (int idx = 0; idx < MAX_LINES; idx++) 
      { 
       writer.WriteLine(reader.ReadLine()); 
       if (reader.EndOfStream) break; 
      } 
      writer.Close(); 
     } 
     reader.Close(); 
Questions connexes