to stycznie związane an earlier question of mine.Czy odczytać plik, używając wyrażenia regularnego?
Zasadniczo rozwiązanie w tej kwestii działał świetnie, ale teraz muszę się przystosować go do pracy w znacznie większym zastosowaniu analizy. Po prostu użycie StreamReader.ReadToEnd()
jest nie do przyjęcia, ponieważ niektóre z plików, które będę czytać, są bardzo, bardzo duże. Jeśli pojawił się błąd i ktoś zapomniał oczyścić, teoretycznie mogą być gigabajty. Oczywiście nie mogę po prostu czytać do końca tego.
Niestety, normalne linie odczytu są również niedopuszczalne, ponieważ niektóre wiersze danych, które odczytuję zawierają ślady stosów - w ich formatowaniu są oczywiście używane /r/n
. Idealnie, chciałbym powiedzieć programowi, aby czytał dalej, dopóki nie trafi na dopasowanie do wyrażenia regularnego, które następnie zwraca. Czy jest jakaś funkcjonalność do tego w .net? Jeśli nie, czy mogę uzyskać jakieś sugestie dotyczące tego, jak je napisać?
Edit: Żeby było trochę łatwiej śledzić moje pytanie, oto pasta z niektórych ważnych częściach przystosowanego kodu:
foreach (var fileString in logpath.Select(log => new StreamReader(log)).Select(fileStream => fileStream.ReadToEnd()))
{
const string junkPattern = @"\[(?<junk>[0-9]*)\] \((?<userid>.{0,32})\)";
const string severityPattern = @"INFO|ERROR|FATAL";
const string datePattern = "^(?=[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3})";
var records = Regex.Split(fileString, datePattern, RegexOptions.Multiline);
foreach (var record in records.Where(x => string.IsNullOrEmpty(x) == false))
......
Problem polega na foreach. .Select(fileStream => fileStream.ReadToEnd())
źle wysadzi pamięć, po prostu to wiem.
I masz jeden z głównych powodów, dla których nie bardzo zależy mi na użyciu RegEx do takich zadań. Jeśli napisałeś prosty parser, możesz go po prostu dostosować do obsługi nowych linii. –
@ JonathanWood Wyrażenia regularne są niesamowite do analizowania poszczególnych rekordów po tym, jak mam cały rekord. Po prostu wyskakuję wszystkie potrzebne informacje i przechodzę od razu do powiązanych pól. Problem polega na tym, że w tym przypadku plik jest wprowadzany, wydaje się, że po prostu nie jest wystarczająco elastyczny, aby dać mi pojedynczy rekord na raz z plikiem, który mam. Ale to wydaje się fałszywe, prawda? To nie może być rzadki problem. – tmesser
Tak więc ślad stosu ma/r/n. Dlaczego to eliminuje readline? – Paparazzi