2010-11-30 13 views
5

C#では、文字エンコーディングを維持しながら、テキストファイルを複数のテキストファイルに分割する最も効率的な方法(分割デリミタは空白行です)は何ですか?テキストファイルを複数のファイルに分割する方法は?

+1

あなたのタイトルとあなたの実際の質問が異なっています。テキストファイル(タイトル)を分割する方法や、それをより効率的に行う方法(質問)を知りたいですか? –

+0

私は両方を探しています。最も効率的な方法でテキストファイルを分割する! – GPX

答えて

7

私はStreamReaderをとのStreamWriterクラスを使用します。

public void Split(string inputfile, string outputfilesformat) { 
    int i = 0; 
    System.IO.StreamWriter outfile = null; 
    string line; 

    try { 
      using(var infile = new System.IO.StreamReader(inputfile)) { 
       while(!infile.EndOfStream){ 
        line = infile.ReadLine(); 
        if(string.IsNullOrEmpty(line)) { 
         if(outfile != null) { 
          outfile.Dispose(); 
          outfile = null; 
         } 
         continue; 
        } 
        if(outfile == null) { 
         outfile = new System.IO.StreamWriter(
          string.Format(outputfilesformat, i++), 
          false, 
          infile.CurrentEncoding); 
        } 
        outfile.WriteLine(line); 
       } 

      } 
    } finally { 
      if(outfile != null) 
       outfile.Dispose(); 
    } 
} 

あなたは、このように、このメソッドを呼び出します。

Split("C:\\somefile.txt", "C:\\output-files-{0}.txt"); 
+0

+1ですが、空白行にnullまたは空の文字列ではなく、 'System.Environment.NewLine'という値があるかどうか疑問です。 –

+0

@adrift: 'System.Environment.NewLine'はすべての行の末尾(または先頭)に追加されませんか? – GPX

+0

テキストファイルの "空白行"は、常に\ r \ n(またはOSに基づいた亜種)ですが、それ以外はどのように検出しますか?テキストファイルは文字列です。 –

0

純粋な思考を避けたい人のために:

場合CSV(カンマ区切りの値)ファイルがあり、フィールドが変更されたときにファイルを分割し、変更によってファイルを識別/名前付けします(不要な引用符は不要です)。 (ここでは#」で始まるによって識別される)ertainライン

修正方法:

public void Split(string inputfile, string outputfilesformat) 
{ 

    System.IO.StreamWriter outfile = null; 
    string line; 
    string[] splitArray; 
    string nameFromFile = ""; 
    try 
    { 
     using (var infile = new System.IO.StreamReader(inputfile)) 
     { 
      while (!infile.EndOfStream) 
      { 
       line = infile.ReadLine(); 
       splitArray = line.Split(new char[] { ',' }); 
       if (!splitArray[0].StartsWith("\"#")) 
       { 
        if (splitArray[4].Replace("\"", "") != nameFromFile.Replace("\"", "")) 
        { 
         if (outfile != null) 
         { 
          outfile.Dispose(); 
          outfile = null; 
         } 
         nameFromFile = splitArray[4].Replace("\"", ""); 
         continue; 
        } 
        if (outfile == null) 
        { 
         outfile = new System.IO.StreamWriter(
          string.Format(outputfilesformat, nameFromFile), 
          false, 
          infile.CurrentEncoding); 
        } 
        outfile.WriteLine(line); 
       } 
      } 
     } 
    } 
    finally 
    { 
     if (outfile != null) 
      outfile.Dispose(); 
    } 
} 

ローカルパスコール:

string strpath = Server.MapPath("~/Data/SPLIT/DATA.TXT"); 
    string newFile = Server.MapPath("~/Data/SPLIT"); 
    if (System.IO.File.Exists(@strpath)) 
    { 
     Split(strpath, newFile+"\\{0}.CSV"); 
    } 
関連する問題