मैंने इसे 2 अलग-अलग तरीकों से उपयोग करके पूरा किया, पहला: फ़ाइल को स्मृति में पढ़ना और रीगेक्स प्रतिस्थापन या स्ट्रिंग प्रतिस्थापन का उपयोग करना। फिर मैं पूरी स्ट्रिंग को एक अस्थायी फ़ाइल में जोड़ता हूं।
दूसरा टैब द्वारा फ़ाइल फ़ाइल लाइन को पढ़कर और मैन्युअल रूप से स्ट्रिंगबिल्डर का उपयोग करके प्रत्येक पंक्ति का निर्माण करके और परिणाम फ़ाइल में प्रत्येक संसाधित लाइन को जोड़कर है।
पहली विधि सामान्य रेगेक्स प्रतिस्थापन के लिए अच्छी तरह से काम करती है, लेकिन यदि आप Regex.Match को एक बड़ी फ़ाइल में करने का प्रयास करते हैं तो यह स्मृति को हॉग करता है।
static void ProcessLargeFile()
{
if (File.Exists(outputDefsFileName)) File.Delete(outputDefsFileName);
if (File.Exists(defTempProc1FileName)) File.Delete(defTempProc1FileName);
if (File.Exists(defTempProc2FileName)) File.Delete(defTempProc2FileName);
string text = File.ReadAllText(inputDefsFileName, Encoding.UTF8);
// PROC 1 This opens entire file in memory and uses Replace and Regex Replace
text = text.Replace("</text>", "");
text = Regex.Replace(text, @"\<ref.*?\</ref\>", "");
File.WriteAllText(defTempProc1FileName, text);
// PROC 2 This reads file line by line and uses String.IndexOf and String.Substring and StringBuilder to build the new lines
using (var fileStream = File.OpenRead(defTempProc1FileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
{
string line, newdef;
while ((line = streamReader.ReadLine()) != null)
{
String[] arr = line.Split('\t');
string def = arr[2];
newdef = Util.ProcessDoubleBrackets(def);
File.AppendAllText(defTempProc2FileName, newdef + Environment.NewLine);
}
}
}
public static string ProcessDoubleBrackets(string def)
{
if (def.IndexOf("[[") < 0)
return def;
StringBuilder sb = new StringBuilder();
... Some processing
sb.Append(def.Substring(pos, i - pos));
... Some processing
return sb.ToString();
}
स्रोत
2017-10-02 04:09:48
केवल एक टिप के रूप में इस टिप्पणी पर विचार करें: आप दृश्य स्टूडियो है, तो आप समाधान में फ़ोल्डर शामिल हैं और खोज का उपयोग करें और भाग्य – StackOrder