2011-10-12 93 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。 –