2014-01-09 71 views
1


我有一個C#代碼中 我有一個包含客戶數據如下csv文件:CSV到XML使用LINQ

ClientNumber1,Name1, BenefitCode1, EffectiveDt1 
ClientNumber1,Name1, BenefitCode2, EffectiveDt2 
ClientNumber2,Name2, BenefitCode3, EffectiveDt3 

在現在這個情況下,我希望輸出XML有複式同一客戶(例如,在我的CSV前兩行具有相同的客戶,但兩種不同的福利)內標籤Benefit

我的XML輸出應該像

<Member> 
<Num>ClientNumber1<Num> 
<Nm>Name1</Nm> 
<Benefit> 
    <Bc>BenefitCode1</Bc> 
    <Dt>EffectiveDt1</Dt> 
</Benefit> 
<Benefit> 
    <Bc>BenefitCode2</Bc> 
    <Dt>EffectiveDt2</Dt> 
</Benefit> 
</Member> 
<Member> 
<Num>ClientNumber1<Num> 
<Nm>Name2</Nm> 
<Benefit> 
    <Bc>BenefitCode3</Bc> 
    <Dt>EffectiveDt3</Dt> 
</Benefit> 
</Member> 

所以基本上,我在執行LINQ的時候,我也應該可以用ClientNum來檢查它,如果我有相同的數字,那麼應該在同一個Member標記中添加好處數據。

謝謝。

+1

這跟文件eems像你需要反序列化csv字符串到數據結構,然後將其序列化到xml – Grundy

+3

歡迎來到SO!向我們展示到目前爲止你已經嘗試過什麼,以及你有什麼具體問題,因爲SO不是'給我寫代碼'門戶。 –

+0

那麼目前我已經嘗試了下面的代碼,這個工程,但我需要將利益數據聚合成單個標籤。
String [] File1 = File.ReadAllLines(@「C:\ Desktop \ test.csv」); String xml =「」; 的XElement頂部=新的XElement( 「客戶」, 從File1中 項目讓田= items.Split( '') 選擇新的XElement( 「利」, 新的XElement( 「BC」,字段[0]), new XElement(「dt」,fields [1]) ) ); File:WriteAllText(@「C:\ Desktop \ xmlout.xml」,xml + top.ToString()); – Amar

回答

2

我將拆分此成兩個明顯分開的步驟:

1)由文件創建數據表示 - 通過創建匿名類型,由客戶端編號分組:

var data = File.ReadAllLines(@"C:\Desktop\test.csv") 
       .Select(line => line.Split(',')) 
       .Select(parts => new 
       { 
        ClientNumber = parts[0].Trim(), 
        Name = parts[1].Trim(), 
        BenefitCode = parts[2].Trim(), 
        EffectiveDate = parts[3].Trim() 
       }) 
       .GroupBy(x => x.ClientNumber); 

2)保存的數據作爲XML:

var xml = new XDocument(
     new XElement("SomeRoot", 
       output.Select(e => new XElement("Member", 
         new XElement("Num", e.Key), 
         new XElement("Name", e.First().Name), 
         e.Select(x => new XElement("Benefit", 
          new XElement("Bc", x.BenefitCode), 
          new XElement("Dt", x.EffectiveDate))) 
        )) 
      ) 
    ); 

然後你可以將它保存與xml.Save(...)

+0

我有更多的列和不同的數據類型,但此代碼有效。非常感謝...!!! – Amar