【问题标题】:Quotes in between a csv column text cause skipping of remaining columns while importing csv datacsv 列文本之间的引号导致在导入 csv 数据时跳过剩余的列
【发布时间】:2012-01-04 09:33:39
【问题描述】:

我正在使用以下代码从 csv 文件中获取数据:

    public DataTable GetCSVData(string CSVFileName)
    {
        string CSVConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + ConfigurationSettings.AppSettings["CSVFolder"].ToString() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False;";

        using (OdbcConnection Connection = new OdbcConnection(CSVConnectionString))
        {
            DataTable CSVDataTable = new DataTable();

            string SelectQuery = string.Format(@"SELECT * FROM [{0}]", CSVFileName);

            OdbcDataAdapter Adapter = new OdbcDataAdapter(SelectQuery, Connection);

            Adapter.Fill(CSVDataTable);

            return CSVDataTable;
        }
    }

确切的问题是,如果一个 csv 列包含一个数据,该数据以粗体突出显示,如下面的第 1 行所示

Row1-> col1,"cdwdf" dsdfs,col2,col3

使用上述代码获取数据时会跳过 col2 和 col3(突出显示文本之后的列),并继续从下一行获取数据。

如果第 1 行中提到的列文本完全在引号内 ("cdwdf dsdfs"),则数据被正确提取。

任何人请告诉我在这种情况下如何从 csv 中获取数据...

【问题讨论】:

  • 我认为下面的 skajfes 评论在技术上是正确的 - csv 格式错误。您可以重新创建您的 csv,还是需要您的读者更加宽容?我们还使用 Lumenworks (Fast CSV Reader) fwiw。
  • @Rob,所以由于 ("cdwdf" dsdfs) 之间的引号,剩余的列在获取时会被跳过,对吧?

标签: c# import-from-csv


【解决方案1】:

双引号是csv specification 的一部分。如果您的数据包含双引号,则整个字段(或列)必须用双引号括起来,并且字段内的任何双引号都必须使用双引号进行转义。

所以你的行应该是这样的:

Row1-> col1,"""cdwdf"" dsdfs",col2,col3

我没有使用任何 CSV 库,所以我无法推荐任何库,但您可以轻松地自己解析文件。只需逐行读取文件并用','分割。问题是跨多行的字段....

编辑:所以总结一下,你需要修改你的 CSV 输入文件或找到一个更宽容的解析器,或者在找到格式错误的 CSV 记录时至少会抛出异常.乍一看,FAST CSV reader 其他人建议似乎是一个不错的起点,因为它声称格式错误的 CSV 会导致它失败并出现有意义的异常。

【讨论】:

  • 用 ',' 分割不是一个好主意,因为字段可以包含逗号,只要用引号括起来。
  • 好吧,我说那会带来其他问题。但是由于双引号,他显然没有解析格式良好的 csv,所以他要么必须找到一个更宽容的 csv 解析器,要么自己做。前提是他不能修改 csv 文件本身。
  • @skajfes,因此,由于 ("cdwdf" dsdfs) 之间的引号,其余列在获取时会被跳过,对吧?
  • 我会说是的。我不能声称知道 Microsoft Text ODBC 驱动程序内部发生了什么,但我猜想当时解析该行时出错,并且该行的其余部分被跳过了。
  • @skajfes,我同意你的看法。. csv 应该遵循标准,对吧?我怎样才能验证格式如此糟糕的 csv?你有什么建议吗?它也不适用于 Giorgi 的解决方案,对吧?
【解决方案2】:

我会使用Fast CSV Reader,因为它非常快并且擅长识别 csv 文件结构。

【讨论】:

  • 如果 csv 格式不正确(),如 skajfes 所述,这是否有效?
猜你喜欢
  • 1970-01-01
  • 2014-11-10
  • 2018-11-17
  • 1970-01-01
  • 2014-01-05
相关资源
最近更新 更多