当前位置: 首页 > 编程语言 > C#

将非常大的文件从xml转换为csv分享

时间:2023-04-10 23:52:35 C#

C#学习教程:将超大文件从xml转换为csv我的问题是,目前这适用于大约100-200mbs的文件,并且转换时间非常短(最多1-2分钟),但我现在需要它来处理更大的文件(每个1-2GB)。目前该程序会冻结计算机,使用此功能转换大约需要30-40分钟。不确定我将如何更改此功能。任何帮助将不胜感激!stringall_lines=File.ReadAllText(p);all_lines=""+all_lines+"";XmlDocumentdoc_all=newXmlDocument();doc_all.LoadXml(all_lines);StreamWriterwrite_all=newStreamWriter(FILENAME1);XmlNodeListrows_all=doc_all.GetElementsByTagName("XML");foreach(XmlNoderowtempinrows_all){Listchildren_all=newList();foreach(XmlNodechildtempinrowtemp.ChildNodes){children_all.Add(Regex.Replace(childtemp.InnerText,"\s+",""));}write_all.WriteLine(string.Join(",",children_all.ToArray()));}write_all.Flush();write_all.Close();示例输入::1,4,7,,5你好,那里,我的,名字,是,杰克,姓氏,名字,缺失,以上3,6,7,,8,41,5,7,,3你好,there,my,name,is,mary,janelast,name,not,missing,above3,6,7,,8,4示例输出::1,4,7,,5,hello,there,my,name,is,jack,,last,name,missing,above,3,6,7,,8,41,5,7,,3,hello,there,my,name,is,mary,jane,last,name,not,missing,above,3,6,7,,8,4您需要一种流式处理方法,因为您当前正在将整个2Gb文件读入内存,然后对其进行处理。您应该阅读一些XML,编写一些CSV并继续这样做,直到您处理完所有内容。一种可能的解决方案如下:(e=>Regex.Replace(e.Value,"\s+",""));varline=string.Join(",",值);writer.WriteLine(行);StreamElements的灵感来自XmlReader中XElement的JonSkeetStreaming来回答这个问题。我做了一些更改以支持您的“无效”XML(因为您没有根元素):使用(XmlReaderreader=XmlReader.Create(fileName,settings)){while(reader.Read()){if(reader.NodeType==XmlNodeType.Element){if(reader.Name==elementName){varel=XNode.ReadFrom(读者)作为XElement;if(el!=null){yieldreturnel;如果您准备好考虑做一些完全不同的事情,请下载Saxon-EE9.6,获得评估许可证,然后运行以下流式XSLT3.0代码:

它冻结是因为File.ReadAllText(p);文件.ReadAllText(p);不会将完整的文件读入内存。(这将首先开始交换,然后因为没有更多可用内存而停止CPU)使用分块方法:逐行读取,逐行转换,逐行写入。使用一些较低级别的XMLReader类而不是XmlDocument有两种变体。第一种是隐藏程序冻结,使用BackgroundWorker。第二:使用任何阅读器(Xml或任何文本文件)逐个字符串地读取文本文件。您可以组合这些变体。以上就是C#学习教程的全部内容:超大文件xml转csv分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: