Прочитать файл построчно c
Я пытаюсь прочитать некоторые текстовые файлы, где каждая строка должна быть обработана. На данный момент я просто использую StreamReader, а затем читаю каждую строку отдельно.
мне интересно, есть ли более эффективный способ (с точки зрения LoC и читаемости) сделать это с помощью LINQ без ущерба для операционной эффективности. Примеры, которые я видел, включают загрузку всего файла в память, а затем его обработку. В этом случае, однако, я не считаю, что это было бы очень эффективный. В первом примере файлы могут получить до 50k, а во втором примере не все строки файла должны быть прочитаны (размеры обычно
вы можете утверждать, что в настоящее время это не имеет значения для этих небольших файлов, однако я считаю, что такой подход приводит к неэффективному коду.
вы можете написать линейный считыватель на основе LINQ довольно легко, используя блок итератора:
или сделать Джона счастливым:
тогда у вас есть ReadFrom(. ) как лениво оцененная последовательность без буферизации, идеально подходит для Where etc.
обратите внимание, что если вы используете OrderBy или стандартный GroupBy , он должен будет буферизировать данные в памяти; Если вам нужна группировка и агрегация, "PushLINQ" имеет некоторый причудливый код, позволяющий выполнять агрегации данных но отбросьте его (без буферизации). Объяснение Джона!--13-->здесь.
проще прочитать строку и проверить, является ли она нулевой, чем постоянно проверять EndOfStream.
однако у меня также есть LineReader класс MiscUtil что делает все это намного проще - в основном это предоставляет файл (или Func<TextReader> как IEnumerable<string> что позволяет вам делать LINQ вещи над ним. Таким образом, вы можете делать такие вещи, как:
сердце LineReader это реализация IEnumerable<string>.GetEnumerator :
почти все остальная часть источника просто дает гибкие способы настройки dataSource (это Func<TextReader> ).
Примечание: вы должны следить за IEnumerable<T> решение, так как это приведет к открытию файла на время обработки.
например, с ответом Марк Gravell-это:
файл останется открытым для всей обработки.
спасибо всем за ваши ответы! Я решил пойти со смесью, в основном сосредоточившись на марке, хотя мне нужно будет только прочитать строки из файла. Я думаю, вы можете утверждать, что разделение необходимо везде, но жизнь слишком коротка!
Что касается сохранения файла открытым, это не будет проблемой в этом случае, так как код является частью настольного приложения.
Читайте также: