首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中重新格式化和解析巨大的文本文件

在C#中重新格式化和解析巨大的文本文件
EN

Stack Overflow用户
提问于 2015-04-10 14:46:50
回答 2查看 194关注 0票数 0

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

代码语言:javascript
复制
 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,代码中断时会出现内存不足的exception.My代码中断

代码语言:javascript
复制
contents = contents + File.ReadAllText(file).Replace("&gt;", ">").Replace("&lt;", "<").Replace("&quot;", "'");

我有什么替代方案来做同样的操作,并有效地处理文件。

EN

回答 2

Stack Overflow用户

发布于 2015-04-10 15:46:25

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

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

  • 输出XML头
  • 输出开始的<root>标记
  • 迭代您的文件:
    • 当您在包装的阅读器上看到D12或D13时,输出尖括号而不是H214H115当您看到D16标记时,将其视为file

的结束

  • 输出结束的</root>

然后使用接受TextReader并传递FormattingReader实例的XmlReader.Create()重载。

票数 2
EN

Stack Overflow用户

发布于 2015-04-10 14:56:36

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29555067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档