首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析C#中复杂的逗号分隔字符串

问解析C#中复杂的逗号分隔字符串
EN

Stack Overflow用户
提问于 2015-05-06 13:21:26
回答 6查看 274关注 0票数 1

我知道如何从分开的字符串中获取子字符串,但这里有一个复杂的问题:如果子字符串包含昏迷,怎么办?

如果子字符串包含昏迷、新行或双引号,则整个子字符串将被双引号封装。

如果子字符串包含双引号,则用另一个双引号转义双引号。最坏的情况是,如果我有这样的情况:

代码语言:javascript
复制
first,"second, second","""third"" third","""fourth"", fourth"

在这种情况下,子字符串是:

  • 第一
  • 第二,第二
  • “第三”
  • “第四”,第四

第二,第二个是用双引号封装的,我不希望这些双引号出现在列表/数组中。

“第三”第三是封装双引号,因为它包含双引号,而那些是转义与调整双引号。同样,我不希望将双引号封装在列表/数组中,也不希望双引号转义双引号,但我希望原始双引号是子字符串的一部分。

EN

回答 6

Stack Overflow用户

发布于 2015-05-06 13:32:38

使用TextFieldParser的一种方法

代码语言:javascript
复制
using (var reader = new StringReader("first,\"second, second\",\"\"\"third\"\" third\",\"\"\"fourth\"\", fourth\""))    
using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader))
{
    parser.Delimiters = new[] { "," };
    parser.HasFieldsEnclosedInQuotes = true;

    while (!parser.EndOfData)
    {
        foreach (var field in parser.ReadFields())
            Console.WriteLine(field);
    }
}

为

代码语言:javascript
复制
first
second, second
"third" third
"fourth", fourth
票数 4
EN

Stack Overflow用户

发布于 2015-05-06 13:32:22

尝尝这个

​

代码语言:javascript
复制
           string input = "first,\"second, second\",\"\"\"third\"\" third\",\"\"\"fourth\"\", fourth\"";

            string[] output = input.Split(new string[] {"\",\""}, StringSplitOptions.RemoveEmptyEntries);

​

票数 0
EN

Stack Overflow用户

发布于 2015-05-06 13:33:29

我建议你为这个问题构造一个小的状态机。你会有这样的状态:

  • 在到达第一个字段之前
  • InQuoted --你当时出去了,“到了;现在你到了,这里引用了你的话
  • InQuotedMaybeOut -您曾经是InQuoted并且“到达了;现在您等待下一个字符来判断它是另一个”还是其他什么;如果是其他的话,那么选择下一个有效的状态(字符可以是空格、新行、逗号,所以您决定下一个状态);否则,如果“到达了,就推”到输出,然后退到InQuoted。
  • 出站后,当除“和”以外的任何字符到达时,您将自动在一个未引用的新字段中。

这肯定会正确地读到CSV。您也可以使分隔符可配置,以便您支持TSV或分号分隔格式.

还请记住CSV格式中一个非常重要的情况:引用字段可能包含新行!另一个需要注意的特殊情况:空字段(如:,,)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30078054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档