2017-01-17 36 views
0

我很新的編程在C#中,我有一些問題,以處理大量的數據在一個XML文件的幾個CSV文件。如何合併大的CSV文件,並將它們轉換成一個XML文件

的CSV文件,我有如下所示:

"ID","NODE","PROCESS_STATE","TIME_STAMP","PREV_TIME_STAMP","CALCULATED" 
206609474,2175,47,31.03.2015 00:01:25,31.03.2015 00:01:24,1 
206609475,2175,47,31.03.2015 00:02:25,31.03.2015 00:01:25,1 
206609476,2175,47,31.03.2015 00:03:25,31.03.2015 00:02:25,1 

在第一步我刪除不適合我的計算重要的條目(例如我刪除不包含具體日期的所有文件),然後再保存每個文件。

第二步是將所有準備好的文件(~100)合併成一個大的csv文件。

直到這裏一切工作都很好,很快。

的最後一步是將CSV文件轉換成以下格式的XML文件:

<data-set> 
    <PDA_DATA> 
    <ID>484261933</ID> 
    <NODE>2190</NODE> 
    <PROCESS_STATE>18</PROCESS_STATE> 
    <PREV_TIME_STAMP>05.05.2016 22:53:41</PREV_TIME_STAMP> 
    </PDA_DATA> 
    <PDA_DATA> 
    <ID>484261935</ID> 
    <NODE>2190</NODE> 
    <PROCESS_STATE>47</PROCESS_STATE> 
    <PREV_TIME_STAMP>06.05.2016 00:44:17</PREV_TIME_STAMP> 
    </PDA_DATA> 
</data-set> 

正如你可以看到我刪除元素(「TIME_STAMP」,「計算」),並進一步我還刪除了條目「TIME_STAMP」等於「PREV_TIME_STAMP」的所有條目。我正在用下面的代碼:

string[] csvlines = File.ReadAllLines("All_Machines.csv"); 

XElement xml = new XElement("data-set", 
    from str in csvlines 
    let columns = str.Split(',') 
    select new XElement("PDA_DATA", 
     new XElement("ID", columns[0]), 
     new XElement("NODE", columns[2]), 
     new XElement("PROCESS_STATE", columns[5]), 
     new XElement("TIME_STAMP", columns[6]), 
     new XElement("PREV_TIME_STAMP", columns[9]), 
     new XElement("CALCULATED", columns[10]))); 

// Remove unneccessray elements 

xml.Elements("PDA_DATA") 
    .Where(e => 
     e.Element("TIME_STAMP").Value.Equals(e.Element("PREV_TIME_STAMP").Value)) 
      .Remove(); // Remove entries with duration = 0 

xml.Elements("PDA_DATA").Elements("TIME_STAMP").Remove(); 
xml.Elements("PDA_DATA").Elements("PREV_PROCESS_STATE").Remove(); 
xml.Elements("PDA_DATA").Elements("CALCULATED").Remove(); 
xml.Save("All_Machines.xml"); 

這是我的問題。如果我排除刪除時間戳等於PrevTimeStamp的元素的行,那麼所有工作都非常好,速度也很快。 但是使用這個命令,它需要花費很多時間,並且只能使用小的csv文件。

我對資源節約型編程毫無知識,所以如果有人能告訴我問題在哪裏或如何做得更好,我會非常高興。

+0

也許你可以查看PLINQ,看看你是否可以並行運行linq查詢https://msdn.microsoft.com/en-us/library/dd460688(v=vs 0.110)。如px – Bassie

+0

在那找不到任何東西。但我試圖創建一個第二個XML文件,其中只添加了滿足條件的元素。這似乎要快得多,我現在可以處理100MB的csv文件,這在以前是不可能的! – Aiye

+0

你確定你上面發佈的代碼和csv是否創建了給定的xml?當我對csv運行該代碼時,我的xml只有1個'PDA_DATA'元素,其中的元素包含字符串'ID','NODE'等...請發佈一個完整的可重用示例 – Bassie

回答

0

這工作得更快:

string[] csvlines = File.ReadAllLines("All_Machines.csv"); 

    XElement xml = new XElement("data-set", 
     from str in csvlines 
     let columns = str.Split(',') 
     select new XElement("PDA_DATA", 
      new XElement("ID", columns[0]), 
      new XElement("NODE", columns[1]), 
      new XElement("PROCESS_STATE", columns[2]), 
      new XElement("TIME_STAMP", columns[3]), 
      new XElement("PREV_TIME_STAMP", columns[4]), 
      new XElement("CALCULATED", columns[5]), 
          ) 
          ); 

    // Remove unneccessray elements 

     XElement xml2 = new XElement("data-set",          
       from el in xml.Elements() 
       where (el.Element("TIME_STAMP").Value != (el.Element("PREV_TIME_STAMP").Value)) 
       select el 
       ); 

     xml2.Elements("PDA_DATA").Elements("TIME_STAMP").Remove(); 
     xml2.Elements("PDA_DATA").Elements("PREV_PROCESS_STATE").Remove(); 
     xml2.Elements("PDA_DATA").Elements("CALCULATED").Remove(); 
     xml2.Save("All_Machines.xml"); 

仍超過150 MB ..什麼更好的建議不適合的CSV文件的大小?

0

隨着Cinchoo ETL - 一個開源框架,你可以閱讀,並與幾行代碼如下

using (var csv = new ChoCSVReader("NodeData.csv").WithFirstLineHeader(true) 
    .WithFields("ID", "NODE", "PROCESS_STATE", "PREV_TIME_STAMP")) 
{ 
    using (var xml = new ChoXmlWriter("NodeData.xml").WithXPath("data-set/PDA_DATA")) 
     xml.Write(csv); 
} 

快速編寫CSV/XML大文件輸出XML看起來像

<data-set> 
    <PDA_DATA> 
    <ID>206609474</ID> 
    <NODE>2175</NODE> 
    <PROCESS_STATE>47</PROCESS_STATE> 
    <PREV_TIME_STAMP>31.03.2015 00:01:25</PREV_TIME_STAMP> 
    </PDA_DATA> 
    <PDA_DATA> 
    <ID>206609475</ID> 
    <NODE>2175</NODE> 
    <PROCESS_STATE>47</PROCESS_STATE> 
    <PREV_TIME_STAMP>31.03.2015 00:02:25</PREV_TIME_STAMP> 
    </PDA_DATA> 
    <PDA_DATA> 
    <ID>206609476</ID> 
    <NODE>2175</NODE> 
    <PROCESS_STATE>47</PROCESS_STATE> 
    <PREV_TIME_STAMP>31.03.2015 00:03:25</PREV_TIME_STAMP> 
    </PDA_DATA> 
</data-set> 

披露:我是該庫的作者

相關問題