यह स्पर्शरेखीय an earlier question of mine.नियमित अभिव्यक्ति का उपयोग कर फ़ाइल में पढ़ें?
से संबंधित है अनिवार्य रूप से, कि प्रश्न में समाधान महान काम किया, लेकिन अब मैं एक बहुत बड़ा विश्लेषण आवेदन में काम करने के लिए यह अनुकूल करने के लिए की जरूरत है। बस StreamReader.ReadToEnd()
का उपयोग स्वीकार्य नहीं है, क्योंकि कुछ फाइलें जो मैं पढ़ रहे हों, वे बहुत बड़ी हैं। अगर कोई गलती हुई है और कोई साफ करने के लिए भूल गया है, तो वे सैद्धांतिक रूप से गीगाबाइट बड़े हो सकते हैं। जाहिर है, मैं सिर्फ इसके अंत तक नहीं पढ़ सकता।
दुर्भाग्यवश, सामान्य पठन लाइन भी स्वीकार्य नहीं है, क्योंकि डेटा की कुछ पंक्तियों में मैं पढ़ रहा हूं जिसमें स्टैक निशान शामिल हैं - वे स्पष्ट रूप से /r/n
का उपयोग अपने प्रारूपण में करते हैं। आदर्श रूप से, मैं कार्यक्रम को आगे पढ़ने के लिए बताना चाहता हूं जब तक कि यह एक रेगेक्स के लिए एक मैच हिट नहीं करता है, जो उसके बाद आता है। .NET में ऐसा करने के लिए कोई कार्यक्षमता है? यदि नहीं, तो क्या मुझे कुछ सुझाव मिल सकते हैं कि मैं इसे लिखने के बारे में कैसे जाऊं?
संपादित करें: यह थोड़ा आसान मेरे सवाल का पालन करने के लिए करने के लिए यहां अनुकूलित कोड के महत्वपूर्ण भागों में से कुछ की एक पेस्ट है:
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))
......
समस्या Foreach में निहित है। .Select(fileStream => fileStream.ReadToEnd())
मेमोरी बुरी तरह से उड़ाएगा, मुझे बस पता है।
और वहां आपके मुख्य कारणों में से एक है जो मुझे वास्तव में इस तरह के कार्यों के लिए RegEx का उपयोग करने की परवाह नहीं है। यदि आपने एक साधारण पार्सर लिखा है, तो आप इसे नई लाइनों को संभालने के लिए अनुकूलित कर सकते हैं। –
@ जोनाथनवुड पूरे रिकॉर्ड के बाद व्यक्तिगत रिकॉर्ड को पार करने के लिए रेगेक्स अद्भुत हैं। मैं बस अपनी सारी जानकारी को पॉप आउट करता हूं और यह सीधे संबंधित क्षेत्रों में जाता है। समस्या इस मामले में फ़ाइल इनपुट है, ऐसा लगता है कि यह मुझे फ़ाइल के साथ एक समय में एक रिकॉर्ड देने के लिए पर्याप्त लचीला नहीं है। लेकिन यह फर्जी लगता है, है ना? यह एक असामान्य समस्या नहीं हो सकती है। – tmesser
तो एक स्टैक ट्रेस/आर/एन है। वह रीडलाइन को क्यों खत्म करता है? – Paparazzi