重新格式化并解析C#中的大文本文件

时间:2015-04-10 06:46:50

标签: c# xml file parsing

在进行一些重新格式化之后,我有一些代码来解析文本文件。

 foreach (string file in Directory.EnumerateFiles(folderPath, "*.*"))
 {
     contents = contents + File.ReadAllText(file).Replace("&gt;", ">").Replace("&lt;", "<").Replace("&quot;", "'");
     pos = contents.LastIndexOf("</event>");
     contents = contents.Substring(0, pos + 8);
 }

 contents = "<?xml version=\"1.0\" encoding=\"utf-8\"?><root>" + contents + "</root>";

 XDocument doc = new XDocument();
 doc = XDocument.Parse(contents);

该文件包含XML标记,但格式不正确。因此,我重新格式化并存储在字符串变量contents中。此字符串将加载到XDocument对象中,程序可以平滑地处理小文件(7-10 MB)。

现在,有些文件大小超过100MB,代码因内存不足而中断。我的代码中断了

contents = contents + File.ReadAllText(file).Replace("&gt;", ">").Replace("&lt;", "<").Replace("&quot;", "'");

我需要有哪些替代方法才能通过有效的文件处理执行相同的操作。

2 个答案:

答案 0 :(得分:2)

正如已经指出的,关键是使用流而不是完整的内存操作。

您可以创建一个自定义TextReader子类FormattingReader,它包装StreamReader或类似内容,并在阅读时动态执行您的格式化过程:

  • 输出XML标题
  • 输出开头<root>代码
  • 迭代您的文件:
    • 当您在包装的阅读器上看到&lt;&gt;时,请改为输出斜角
    • 当您看到</event>标记时,请将其视为文件末尾
  • 输出结束</root>

然后使用TextReader的{​​{3}}重载并传递FormattingReader的实例。

答案 1 :(得分:1)

您无法使用XDocument处理超过100 MB的文件,因为它将所有内容存储在内存中并执行内存中的所有操作。为此目的使用XmlReader。