C # обработка нескольких текстовых файлов - PullRequest
1 голос
/ 13 октября 2010

Допустим, вы хотите написать приложение, которое обрабатывает несколько текстовых файлов, предоставляемых в качестве аргументов в командной строке (например, MyProcessor file1 file2 ...).Это очень распространенная задача, для которой часто используется Perl, но что, если кто-то хочет воспользоваться преимуществами .NET напрямую и использовать C #.

Какой простейший код C # 4.0, который позволяет вам делатьэтот?Он должен включать в основном построчную обработку каждой строки из каждого файла и что-то делать с этой строкой, либо вызывая функцию для ее обработки, либо, может быть, есть лучший способ для выполнения такого рода групповой обработки строк (например, LINQ иликакой-то другой метод).

Ответы [ 3 ]

9 голосов
/ 13 октября 2010

Вы можете обрабатывать файлы параллельно, читая каждую строку и передавая ее функции обработки:

class Program
{
    static void Main(string[] args)
    {
        Parallel.ForEach(args, file =>
        {
            using (var stream = File.OpenRead(file))
            using (var reader = new StreamReader(stream))
            {
                string line;
                while ((line = reader.ReadLine()) != null) 
                {
                    ProcessLine(line);
                }
            }
        });
    }

    static void ProcessLine(string line)
    {
        // TODO: process the line
    }
}

Теперь просто вызовите: SomeApp.exe file1 file2 file3

Плюсы этого подхода:

  • Файлы обрабатываются параллельно => с использованием нескольких ядер ЦП
  • Файлы читаются построчно, и только текущая строка сохраняется в памяти, что уменьшает потребление памяти и позволяет работатьс большими файлами
2 голосов
/ 29 октября 2010

После долгих экспериментов изменив эту строку в ответе Дарина Димитрова:

using (var stream = File.OpenRead(file))

до:

using (var stream=new FileStream(file,System.IO.FileMode.Open,
                                 System.IO.FileAccess.Read,
                                 System.IO.FileShare.ReadWrite,
                                 65536))

Изменение размера буфера чтения с 4 КБ по умолчанию на 64 КБ может сократить до 10% времени чтения файла при чтении «строки за раз» с помощью потокового считывателя, особенно если текстовый файл большой. Большие размеры буфера не улучшают производительность.

Это улучшение присутствует даже при чтении с относительно быстрого SSD. Экономия становится еще более существенной, если использовать обычный HD. Интересно, что вы получаете это значительное улучшение производительности, даже если файл уже кэшируется ОС (Windows 7 / 2008R2), что несколько нелогично.

2 голосов
/ 13 октября 2010

Простой;



foreach(var f in args)
{
   var filecontent = File.ReadToEnd();
   //Logic goes here
}

...