Как разбить текстовый файл на несколько файлов? - PullRequest
5 голосов
/ 30 ноября 2010

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

Ответы [ 2 ]

7 голосов
/ 30 ноября 2010

Я бы использовал классы 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 голосов
/ 08 ноября 2013

Чисто для тех, кто хочет не думать:

Если у вас есть файл CSV (значения, разделенные запятыми), и вы хотите разделить файл при изменении поля, идентифицируйте / назовите файл по изменению (без лишних кавычек) и удалите комментарии / определенные строки (здесь указаны начиная с "#)

Модифицированный метод:

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");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...