【问题标题】:Ignore Comma between double quotes while reading CSV file读取 CSV 文件时忽略双引号之间的逗号
【发布时间】:2017-09-18 16:41:10
【问题描述】:

用 c# 语言制作的 CSV 阅读器。它工作正常,但我无法忽略双引号行值之间的逗号(',')。

示例: “aa”、“aa,bb”、“cc”

读起来像

Col1 Col2 Col3 Col4
aa   aa   bb   cc 

而不是这个,它应该读起来像,

Col1 Col2 Col3 
aa   aabb cc 

这是我的代码:

public void LoadFile(String path)
{
    Table.Rows.Clear();
    Table.Columns.Clear();
    StreamReader file = File.OpenText(path);
    String[] header = file.ReadLine().Split(',');
    for (int i = 0; i < Table.ColumnCount; i++)
    {
        Table.Columns[i].Name = "Col " + i;}
        String row = "";
        while ((row = file.ReadLine()) != null)
        {
            Table.Rows.Add(row.Split(','));
        }
        file.Close();
    }
}

【问题讨论】:

  • 您可能需要考虑寻找第 3 方 CVS 阅读器,因为大多数人会为您处理此问题。
  • 有很多 CSV 解析工具,例如 CSVHelper 可以为您完成所有这些工作
  • 我可以从外部 CSV 阅读器那里获得帮助,但尝试添加一个条件以便它可以工作。我使用流阅读器做到了。我正试图让它作为一个应用程序工作。
  • 正如您所发现的,它比仅仅用逗号分割更复杂。如果您要重新创建轮子,您可能需要一次读取一个字符并设置/清除指示您是否在 dbl 报价内的标志。有很多类似的问题在等着你。
  • 对于我自己的非常简单的 CSV 解析器,我使用了状态机。 “在一个条目内”状态处理逗号与“移动到下一个条目”状态不同。

标签: c# csv streamreader


【解决方案1】:

您可以通过用正则表达式拆分函数替换拆分函数来解决此问题

Table.Rows.Add(row.Split(','));

应该替换为

Table.Rows.Add(Regex.Split(row, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"));

并在顶部添加程序集

using System.Text.RegularExpressions;

这将解决您的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多