【问题标题】:Split a comma delimited line being careful not to split on a comma inside block of text拆分逗号分隔的行,注意不要在文本块内的逗号上拆分
【发布时间】:2017-05-10 02:53:36
【问题描述】:

C# 方法是什么split 与分隔符为',' 的字符串注意不要在逗号位于文本块"" 内时拆分。

例如,如果字符串包含

""AAC","AAC Holdings, Inc.""

拆分应该返回([] 在那里假装它是split 返回的string[] 的数组元素)

[AAC] [AAC Holdings, Inc.]

不是

[AAC] [AAC Holdings] [Inc.]

【问题讨论】:

  • Split 可以使用字符组合,所以如果你使用 ", (引号 + 逗号) 而不是逗号,它应该可以工作
  • 您要求使用 CSV 解析器。有很多,但没有一个附带 .NET。
  • Ctl.Data 是一个很好的 CSV 解析器,可以做到这一点。 (无耻的插件,这是我的图书馆)
  • 您可能希望为此使用TextFieldParser。请看我的回答。

标签: c# regex split


【解决方案1】:

这可能最好使用 Microsoft.VisualBasic 库(将其添加到您的 reference)、Microsoft.VisualBasic.FileIO namespaceTextFieldParser 类中,如下所示:

using Microsoft.VisualBasic.FileIO;

...

string str = "\"AAC\",\"AAC Holdings, Inc.\"";          

List<string[]> param = new List<string[]>();
string[] words; //add intermediary reference

using (TextFieldParser parser = new TextFieldParser(new StringReader(str))) {
    parser.Delimiters = new string[] { "," }; //the parameter must be comma
    parser.HasFieldsEnclosedInQuotes = true; //VERY IMPORTANT
    while ((words = parser.ReadFields()) != null)
        param.Add(words);
}

foreach (var par in param)
    Console.WriteLine(string.Join("; ", par));

结果:

AAC; AAC Holdings, Inc.

请注意,TextFieldParserHasFieldsEnclosedInQuotes = true 是专为您的情况设计的。

【讨论】:

    【解决方案2】:

    你可以用","分隔符分割

    var description = "\"AAC\",\"AAC Holdings, Inc.\"";
    var listText = description.Split(new[] { "\",\"" }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var s in listText)
    {
        Console.WriteLine(s.Replace("\"",""));
    }
    
    Console.ReadLine();
    

    返回

    AAC
    AAC Holdings, Inc.
    

    【讨论】:

      【解决方案3】:

      这是一个您可以使用的免费库:FileHelpers。我建议您使用图书馆,因为它会为您处理所有这些恶作剧。请同时查看this,因为他们会将数据加载到DataTable 以完成您需要的操作,我还将在此处复制代码以防链接失效:

      string path = @"C:\";
      using (OleDbConnection conn =
                  new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                  path + @";Extended Properties=""Text;HDR=No;FMT=Delimited"""))
      {
          using (OleDbCommand cmd =
              new OleDbCommand("SELECT * FROM verylarge.csv", conn))
          {
              conn.Open();
      
              using (OleDbDataReader dr =
                  cmd.ExecuteReader(CommandBehavior.SequentialAccess))
              {
                  while (dr.Read())
                  {
                      int test1 = dr.GetInt32(0);
                      int test2 = dr.GetInt32(1);
                      int test3 = dr.GetInt32(2);
                      int test4 = dr.GetInt32(3);
                      int test5 = dr.GetInt32(4);
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2011-09-08
        相关资源
        最近更新 更多