我有C#代码删除传入文本文件中的非ASCII字符,然后输出到.NonAsciiChars文本文件。 因为传入的文件是XML格式,返回方法可以是LF ONLY或CRLF,这就是为什么我没有逐行替换(我正在使用StreamReader.ReadToEnd())
现在问题是当传入的文件很大(大约2 GB)时,我收到以下错误。有没有更好的方法在我的案例中删除非ASCII字符?传入的文件也会发送大约4GB,我担心在那个时候,读取部分也会得到OutOfMemoryException。
非常感谢。
DateTime:2014-08-04 12:55:26,035 Thread ID:[1] Log Level:ERROR Logger Property:OS_fileParser.Program property:[(null)] - Message:System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
at System.Text.StringBuilder.ExpandByABlock(Int32 minBlockCharCount)
at System.Text.StringBuilder.Append(Char* value, Int32 valueCount)
at System.Text.StringBuilder.Append(Char[] value, Int32 startIndex, Int32 charCount)
at System.IO.StreamReader.ReadToEnd()
at OS_fileParser.MyProgram.FormatXmlFile(String inFile) in D:\Test\myProgram.cs:line 530
at OS_fileParser.MyProgram.Run() in D:\Test\myProgram.cs:line 336
myProgram.cs第530行:content = Regex.Replace(content,pattern,“”);
myProgram.cs第336行:这是点调用以下方法
const string pattern = @"[^\x20-\x7E]";
string content;
using (var reader = new StreamReader(inFile))
{
content = reader.ReadToEnd();
reader.Close();
}
content = Regex.Replace(content, pattern, "");
using (var writer = new StreamWriter(inFile + ".NonAsciiChars"))
{
writer.Write(content);
writer.Close();
}
using (var myXmlReader = XmlReader.Create(inFile + ".NonAsciiChars", myXmlReaderSettings))
{
try
{
while (myXmlReader.Read())
{
}
}
catch (XmlException ex)
{
Logger.Error("Validation error: " + ex);
}
}
答案 0 :(得分:3)
您将获得OutOfMemoryException
。为了节省内存,你可以按部分处理文件,here是一个很好的例子,说明如何逐行处理文件,here是按字节,使用缓冲区(读取1个字节很慢)。 / p>
最简单的情况就是这样:
string line;
using (var reader = new StreamReader(inFile))
using (var writer = new StreamWriter(inFile + ".NonAsciiChars"))
while ((line = reader.ReadLine()) != null)
{
... // code to process line
writer.Write(line);
}