Мне нужно читать по очереди файл журнала. Это около 6 МБ в размере и 40000 строк. Но после тестирования моей программы я обнаружил, что этот файл журнала ограничивается только символом LF. Поэтому я не могу использовать метод Readline
класса StreamReader
Как я могу исправить эту проблему?
edit: Я пытался использовать Text Reader, но моя программа все еще не работала:
using (TextReader sr = new StreamReader(strPath, Encoding.Unicode))
{
sr.ReadLine(); //ignore three first lines of log file
sr.ReadLine();
sr.ReadLine();
int count = 0; //number of read line
string strLine;
while (sr.Peek()!=0)
{
strLine = sr.ReadLine();
if (strLine.Trim() != "")
{
InsertData(strLine);
count++;
}
}
return count;
}
Неправильно ли файлы File.ReadAllLines(fileName) загружать файлы с концами LF? Используйте это, если вам нужен весь файл - я видел сайт, указывающий его медленнее, чем другой метод, но это не так, если вы передаете ему правильную кодировку (по умолчанию UTF-8), плюс она такая же чистая, как вы можете получить.
Изменить: Это так. И если вам нужна потоковая передача, TextReader.ReadLine() корректно обрабатывает концы строк Unix.
Изменить еще раз: также StreamReader. Вы только что проверили документацию и предположили, что она не будет обрабатывать концы линии LF? Я смотрю в Reflector, и это похоже на правильную обработку.
TextReader.ReadLine
уже обрабатывает строки, завершаемые только \n
.
От документы:
Линия определяется как последовательность символы, сопровождаемые каретой return (0x000d), подача строки (0x000a), возврат каретки, за которым следует линия feed, Environment.NewLine, или конец маркера потока. Строка, которая возвращенный не содержит завершение возврата каретки и/или line feed. Возвращаемое значение является null reference (Nothing in Visual Basic), если конец входного потока было достигнуто.
Итак, в принципе, все должно быть хорошо. (Я говорил о TextReader
, а не о StreamReader
, потому что тот, где объявлен метод, очевидно, будет работать с StreamReader
.)
Если вы хотите легко итеративно перебирать строки (и потенциально использовать LINQ для файла журнала), вы можете найти класс LineReader
в MiscUtil полезно. Он в основном завершает вызовы ReadLine()
в итераторе. Например, вы можете:
var query = from file in Directory.GetFiles("logs")
from line in new LineReader(file)
where !line.StartsWith("DEBUG")
select line;
foreach (string line in query)
{
// ...
}
Все потоки:)
Или вы можете использовать метод Readblock и самостоятельно разбирать строки
Я бы предположил, что \LF (\n) будет в порядке (тогда как \CR (\ r) - может вызвать проблемы).
Вы можете читать каждую строку персонажа за раз и обрабатывать его, когда вы читаете терминатор.
После профилирования, если это слишком медленно, вы можете использовать буферизацию со стороны приложения с помощью read ([]). Но сначала попробуйте простой персонаж!