StreamReader.ReadLine (), начиная с конца потока - PullRequest
1 голос
/ 09 июля 2009

Я работаю в C # /. NET и анализирую файл, чтобы проверить, соответствует ли одна строка определенному регулярному выражению. На самом деле, я хочу найти последнюю строку, которая соответствует.

Чтобы получить строки моего файла, я в настоящее время использую метод System.IO.StreamReader.ReadLine (), но так как мои файлы очень большие, я хотел бы немного оптимизировать код и начать с конца файл.

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

Ответы [ 4 ]

6 голосов
/ 09 июля 2009

Забавно, вы должны упомянуть об этом - да, я имею. Я написал ReverseLineReader некоторое время назад и поместил его в MiscUtil .

Это был ответ на этот вопрос о переполнении стека - ответ содержит код, хотя он также использует и другие биты MiscUtil.

Он справится только с некоторыми кодировками, но, надеюсь, со всеми, что вам нужно. Обратите внимание, что это будет менее эффективно, чем чтение с самого начала файла, если вам когда-либо придется читать весь файл - все виды вещей могут предполагать прямое движение по файлу, поэтому они оптимизированы для этого. Но если вы на самом деле просто читаете строки в конце файла, это может быть большой победой:)

(Не уверен, должно ли это было просто закрытое голосование или нет ...)

0 голосов
/ 09 июля 2009

Это должно делать то, что вы ищете, это может быть слишком много памяти для того, что вам нужно, но я не знаю, что ваши потребности в этой области:

        string[] lines = File.ReadAllLines("C:\\somefilehere.txt");
        IEnumerable<string> revLines = lines.Reverse();
        foreach(string line in revLines) {
            /*do whatever*/
        }

Это все равно потребует чтения каждой строки с самого начала, но это может быть быстрее, чем проверка каждой из них, когда вы это делаете.

0 голосов
/ 09 июля 2009

"Самый простой" -vs- "Самый оптимизированный" ... Я не думаю, что вы получите оба

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

Вы также можете использовать FileStream, чтобы установить положение в конце вашего файла. Выполните действия, описанные выше, и, если совпадения не найдены, установите позицию FileStream в вашем файле ранее, пока не НАЙДЕТЕ совпадение.

0 голосов
/ 09 июля 2009

Поскольку вы используете регулярное выражение, я думаю, что вам лучше всего прочитать всю строку в памяти, а затем попытаться сопоставить ее.

Возможно, если вы предоставите нам регулярное выражение и образец содержимого файла, мы сможем найти лучший способ решения вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...