একটি বৃহত (50 জিবি) ফাইল দিয়ে আমি এটি এটি করেছি:
আমি 2 টি বিভিন্ন উপায়ে চেষ্টা করেছি: প্রথমটি, ফাইলটিকে মেমরিতে পড়তে এবং রেজেক্স রিপ্লেস বা স্ট্রিং রিপ্লেস ব্যবহার করে। তারপরে আমি পুরো স্ট্রিংটি একটি অস্থায়ী ফাইলে সংযুক্ত করেছি।
প্রথম পদ্ধতিটি কয়েকটি রিজেেক্স প্রতিস্থাপনের জন্য ভালভাবে কাজ করে, তবে রেগেক্স R রিপ্লেস বা স্ট্রিং ep রিপ্লেস মেমরির ত্রুটির কারণ হতে পারে যদি আপনি একটি বড় ফাইলে অনেকগুলি প্রতিস্থাপন করেন।
দ্বিতীয়টি হ'ল লাইন দ্বারা টেম্পল ফাইল লাইনটি পড়া এবং স্ট্রিংবিল্ডার ব্যবহার করে প্রতিটি লাইন ম্যানুয়ালি তৈরি করা এবং ফলাফলের ফাইলে প্রতিটি প্রক্রিয়াযুক্ত লাইন যুক্ত করা। এই পদ্ধতিটি বেশ দ্রুত ছিল।
static void ProcessLargeFile()
{
if (File.Exists(outFileName)) File.Delete(outFileName);
string text = File.ReadAllText(inputFileName, Encoding.UTF8);
// EX 1 This opens entire file in memory and uses Replace and Regex Replace --> might cause out of memory error
text = text.Replace("</text>", "");
text = Regex.Replace(text, @"\<ref.*?\</ref\>", "");
File.WriteAllText(outFileName, text);
// EX 2 This reads file line by line
if (File.Exists(outFileName)) File.Delete(outFileName);
using (var sw = new StreamWriter(outFileName))
using (var fs = File.OpenRead(inFileName))
using (var sr = new StreamReader(fs, Encoding.UTF8)) //use UTF8 encoding or whatever encoding your file uses
{
string line, newLine;
while ((line = sr.ReadLine()) != null)
{
//note: call your own replace function or use String.Replace here
newLine = Util.ReplaceDoubleBrackets(line);
sw.WriteLine(newLine);
}
}
}
public static string ReplaceDoubleBrackets(string str)
{
//note: this replaces the first occurrence of a word delimited by [[ ]]
//replace [[ with your own delimiter
if (str.IndexOf("[[") < 0)
return str;
StringBuilder sb = new StringBuilder();
//this part gets the string to replace, put this in a loop if more than one occurrence per line.
int posStart = str.IndexOf("[[");
int posEnd = str.IndexOf("]]");
int length = posEnd - posStart;
// ... code to replace with newstr
sb.Append(newstr);
return sb.ToString();
}