【问题标题】:C# parse data into CSV without delimiter in quotesC# 将数据解析为 CSV,不带引号分隔符
【发布时间】:2014-11-26 19:41:26
【问题描述】:

我的正则表达式模式需要一点帮助..

我有这样的字符串

第一行:

250;2014-03-01;13:18:31;P25002001873;4006083016590;TCH61159500000;"Ponožky;podkolenky";441;149.00;1.000;;12740000;

第二行:

250;2014-03-01;13:18:31;P25002001873;4006083016590;TCH61159500000;"""NORDIC """ ecs;441;149.00;1.000;;12740000;

我需要通过分隔符来解析这个字符串;.. 有了这个字符串,我需要删除;在第一行。 ("Ponožky;Podkolenky") 但我不想删除任何其他;因为我无法解析它。

模式意味着删除;在引号中.. "Ponožky;Podkolenky" => "Ponožky Podkolenky"

【问题讨论】:

  • 是你的示例字符串中的 2 行还是 1 行
  • 这是你想要删除的唯一东西吗?
  • 是的,只有;在 ””。我需要,因为我想用分隔符分割字符串;
  • @JAttanonRadar:如果只是因为这个原因,还有更简单的方法。
  • 也许是这样。但我找不到它。我找到了一些通过分隔符解析字符串的方法,将引号中的文本作为文本而不解析它。但是我发现不起作用的解决方案

标签: c# regex replace


【解决方案1】:

您不应该使用正则表达式,也不应该为这项任务重新发明轮子。

使用 Microsofts TextFieldParser,它支持开箱即用地解析 CSV 文件:

(它可以根据需要在引用的字段中处理尽可能多的;)。

它“隐藏”在Microsoft.VisualBasic-Framework 中,您只需导入即可。 (将其添加为您的项目的参考)

using Microsoft.VisualBasic.FileIO;

//more of the class

using (TextFieldParser parser = new TextFieldParser("C:\\test\\file.csv"))
{
    parser.CommentTokens = new string[] { "#" };
    parser.SetDelimiters(new string[] { ";" });
    parser.HasFieldsEnclosedInQuotes = true;

    //skip headline if there is any
    //parser.ReadLine();

    while (!parser.EndOfData)
    {
        string[] fields = parser.ReadFields();

        foreach (String s in fields){
            MessageBox.Show(s);
        }
    }
}

连同字符串

1;2;3;"A String; with;many;;;semicolons;;;232;";5;"Another;One"

产生消息框:

1
2
3
A String; with;many;;;semicolons;;;232;
5
Another;One

【讨论】:

  • 我刚刚找到了这个框架。我可能会使用它。谢谢!
【解决方案2】:
".*(;).*"

这意味着找到一个 " 后跟任何字符,然后 ; 和任何字符,最后是一个结束 " 只有 ;在捕获组中

【讨论】:

  • 这适用于给定的两个示例,但在我看来是取消保存以“解析”数据的方式...如果字符串是 "Pono;phonp;onemore" 怎么办?
  • 有了这个就可以了..我是这样用的.. string[] split = Regex.Match(t, "\".*(;).*\"").Value 。分裂(';'); Console.WriteLine(Regex.Replace(t, "\".*(;).*\"", string.Join(" ", split)));
  • 但是我认为如果我用这种方式导入大数据会降低性能
【解决方案3】:

我将改写您的问题:当分隔符出现在用引号保护的字段中时,如何拆分 csv 字符串的字段?

第一种方式:使用 csv 解析器。

第二种方法:不要尝试拆分每个项目,而是尝试找到它们。

string pat = @"""(?>[^""]+|"""")*""|[^;""]*";

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 2020-11-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 2011-06-27
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多