2011-09-02 5 views
1

1000 줄이있는 단일 텍스트 파일을 여러 개의 작은 파일 (예 : 300 줄)로 분할하는 방법은 무엇입니까? 원본 파일의 길이가 1000 라인을 초과 할 수도 있고 적을 수도 있습니다.C# 여러 파일에서 텍스트 파일을 분할하는 방법

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

나는 다음을 시도했지만 효과가 없다.

File.ReadLines(path) 이상
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

루프와 StreamWriter 각 라인을 작성합니다.

카운터를 보관하고 300에 도달 할 때마다 StreamWriter을 닫고 새 카운터를 엽니 다.

1

뿐만 아니라 SLaks는 또한 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

작동하는데 10 시간 이상이 걸렸습니다. 감사합니다. –

6

에 간단한 케이스를 확장 방법 SkipTake를 사용하여 수행 할 수 대답 :

 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(); 
관련 문제