2011-10-12 88 views
2

我已經包含下面的記錄的CSV文件:LINQ的Split函數查詢

Col1中,col2的,COL3

「測試,測試1」,1,3

而且我在下面的Linq查詢中將csv拆分爲XML文檔。但是,對於上面給出的示例,它將「Test,Test1」分解爲兩個單獨的元素。

var xml = new XElement("Root", source.Select(x => 
    new XElement("Testing", x.Split(splitChar).Select((Field, index) => 
     new XElement("Field" + index, Field)))).Skip(1)); 

這會產生這樣的:

<Root> 
<Testing Field0="Test" Field01="Test1" Field02="1" Field03="3" /> 

</Root> 

但我想要的是:

<Root> 
<Testing Field0="Test,Test1" Field01="1" Field02="3" /> 

</Root> 

任何人都可以請幫我achive以上?

回答

1

取而代之的是:

x.Split(splitChar) 

使用正則表達式試試這個方法:

Regex.Matches(x, "\"[^\"]*\"|[^,]+").Cast<Match>().Select(m => m.Value) 

此相匹配,要麼被引用的字段,例如:"foobar,baz"的東西,沒有按」包含一個逗號。

有我的回答一定的侷限性:

  • 手柄逃過字符串引號內,如在這種情況下:"Test1,Test\"two\",Test3",0,1。你需要這個嗎?
  • 分隔符不再是參數,而是硬編碼的。你必須小心,因爲一些字符是特殊的,需要在正則表達式中轉義。如果要基於splitChar的運行時值構建正則表達式,請考慮使用Regex.Escape
+0

謝謝@Mark Byers,上面的正則表達式是什麼? –

+0

感謝堆@Mark Byers,它工作。忽略我以前的評論。不知道爲什麼我看到'x'爲's'。 –

+0

@flybyte:我在編輯中將s更改爲x。 –