有没有更好的方法来替换c#中的非ascii字符?

本文关键字:ascii 字符 替换 更好 方法 有没有 | 更新日期: 2023-09-27 18:16:13

我有c#代码来删除传入文本文件中的非ascii字符,然后输出到。nonasciicars文本文件。因为传入的文件是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);
                    }
                }

有没有更好的方法来替换c#中的非ascii字符?

您将获得OutOfMemoryException。为了节省内存,您可以按部分处理文件,下面是一个很好的例子,说明如何逐行处理文件,这里是按字节处理文件,使用缓冲区(读取1字节很慢)。

最简单的例子是这样的:

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);
        }