【问题标题】:Reading csv file ignore commas inside double quotes and headers [duplicate]读取csv文件忽略双引号和标题中的逗号[重复]
【发布时间】:2015-02-06 20:41:52
【问题描述】:

如何忽略双引号内的逗号和 csv 标题行(第一行)?

 string csvData = File.ReadAllText(csvPath);
                foreach (string row in csvData.Split('\n'))
                {
                    if (!string.IsNullOrEmpty(row))
                    {
                        dt.Rows.Add();
                        int i = 0;
                        foreach (string cell in row.Split(','))
                        {
                            dt.Rows[dt.Rows.Count - 1][i] = cell;

                            i++;
                        }
                    }
                }

【问题讨论】:

标签: c#


【解决方案1】:

来自Microsoft.VisualBasic.dllTextFieldParser 可以帮助满足此要求

using (TextFieldParser MyReader = new TextFieldParser(csvPath))
{
     MyReader.TextFieldType = FieldType.Delimited;
     MyReader.SetDelimiters(",");
     MyReader.HasFieldsEnclosedInQuotes = true;
     string[] currentRow;
     currentRow = MyReader.ReadFields();
     while(!MyReader.EndOfData)
     {
        DataRow row = dt.NewRow();
        currentRow = MyReader.ReadFields();
        for(int i = 0; i < currentRow.Length; i++)
        {
            row[i] = currentRow[i];
        }
        dt.Rows.Add(row); 
     }
 }

根据我有限的经验,这个类不是很快,但你可以在不使用需要随应用程序重新分发的外部包的情况下使用它。

【讨论】:

    【解决方案2】:

    我将以一般伪代码的形式为您提供算法,因为这个问题不是特定于 c# 的,但归结为知道您是否在打开的双引号内。

    1. 保留一个标志,说明您是否在双引号内
    2. 逐字符读取每一行
    3. 点击双引号时只需切换此标志,即可反转其值
    4. 当您读取一个逗号并且标志为 false 时,您可以将读取的所有字符转储为当前单元格值,并开始为新的当前单元格再次累积读取的字符

    【讨论】:

      【解决方案3】:

      使用

      string[] cols = Regex.Split("\"(,\")?")
      

      而不是拆分。

      并忽略第一行。使用 for 循环或在你的 foreach 中有一个计数器来跳过第一个。

      RegEx 来自我的脑海,所以它可能需要一些调整,但它应该可以工作......

      但是这样的事情可以完成......使用 csv 库可能是一个考虑因素......

      【讨论】:

      • 那个正则表达式似乎不起作用,但是 ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]* $)" 确实..尽管大规模评估很慢。
      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 2016-03-08
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 2019-03-28
      相关资源
      最近更新 更多