2011-09-02 69 views
1

如何将1000行的单个文本文件拆分为多个较小的文件(例如每行300行)?请记住,原始文件可能多于或少于一千行。C#如何在多个文件中拆分文本文件

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

我试过以下,但它不工作。

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

这是我的例子做什么。这就是“if(reader.EndOfStream)break”的原因:“ – bigtlb

回答

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

遍历File.ReadLines(path)和写入每行一个StreamWriter

保留一个计数器,并且每次到达300时关闭StreamWriter并打开一个新计数器。

1

除了SLaks回答,您还可以使用它的扩展方法SkipTakeSystem.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

花了我十几个小时才搞定它,谢谢。 –

6

简单的情况:

 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();