【问题标题】:Linq Split function QueryLinq 拆分功能查询
【发布时间】:2011-10-12 13:57:54
【问题描述】:

我有一个包含以下记录的 csv 文件:

Col1,Col2,Col3

"Test,Test1",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>

谁能帮我实现以上目标?

【问题讨论】:

    标签: c# string linq


    【解决方案1】:

    而不是这个:

    x.Split(splitChar)
    

    使用正则表达式尝试这种方法:

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

    这匹配引用的字段,例如:"foobar,baz" 不包含逗号的内容。

    我的回答有一些限制:

    • 处理字符串中的转义引号,例如在本例中:"Test1,Test\"two\",Test3",0,1。你需要这个吗?
    • 分隔符不再是参数,而是硬编码。您必须小心,因为某些字符很特殊,需要在正则表达式中进行转义。如果您想根据splitChar 的运行时值构建正则表达式,请考虑使用Regex.Escape

    【讨论】:

    • 谢谢@Mark Byers,上面的正则表达式是什么?
    • 感谢@Mark Byers,它成功了。忽略我之前的评论。不知道为什么我将“x”视为“s”。
    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2013-02-08
    • 2014-02-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多