2010-11-30 4 views
5

В C#, что является наиболее эффективным методом для разбиения текстового файла на несколько текстовых файлов (разделительный разделитель является пустой строкой), сохраняя кодировку символов?Как разбить текстовый файл на несколько файлов?

+1

Ваше название и ваш фактический вопрос различны. Вы хотите знать, как разбить текстовый файл (заголовок) или как сделать это более эффективно (вопрос)? – 2010-11-30 05:40:36

+0

Я ищу оба. Разделение текстового файла наиболее эффективным способом! – GPX 2010-11-30 05:45:02

ответ

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

Исключительно для тех, кто хочет, чтобы не думать:

Если у вас есть файл CSV (значения, разделенные запятыми), и вы хотите разбить файл при изменении поля, определить/назвать файл изменением (без ненужных меток кавычек) и вырезать комментарии/c 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"); 
    } 
Смежные вопросы