【问题标题】:Handling empty fields in csv during bulk import to database在批量导入数据库期间处理 csv 中的空字段
【发布时间】:2012-09-28 19:49:53
【问题描述】:

我正在将地理编码数据从 csv 文件导入我们的数据库。

我使用了以下库 A fast csv reader 读取 csv 然后使用 SqlBulkCopy

这是我正在导入的数据的示例

"AB10","1BH","L",0,0,,,20
"AB10","1BR","L",39320,80570,57.14214,-2.11400,21

它在良好的数据上工作正常,但在第一行它会抛出异常,因为数据库设置为不接受空值。

有没有办法告诉 bulkcopy 忽略不良数据?我试图通过使用库的内置属性来让 csv 阅读器忽略坏行,但它们似乎不起作用。

csv.SkipEmptyLines = true;
csv.MissingFieldAction = MissingFieldAction.ParseError;
csv.DefaultParseErrorAction = ParseErrorAction.AdvanceToNextLine;

我想另一种选择是预先解析 csv 并删除所有有问题的行。也许有更好的 .net csv 库?

【问题讨论】:

    标签: c# csv sqlbulkcopy idatareader


    【解决方案1】:

    为了处理空条目,我最终将 csv 解析为 DataTable 对象,一次包含 1000 个条目,然后在执行过程中导入它们。

    【讨论】:

      【解决方案2】:

      如果您可以发布您的 csv 阅读器代码,那么我们可以提供更多帮助。但是查看链接页面上的代码,您可以执行以下操作:

      while (csv.ReadNextRecord())
          {
              for (int i = 0; i < fieldCount; i++)
                  Console.Write(string.Format("{0} = {1};",
                                headers[i],
                                csv[i] ?? "null"));
              Console.WriteLine();
          }
      

      看到我在哪里添加了空合并运算符?这应该改变你的输出:

      "AB10","1BH","L",0,0,,,20
      

      "AB10","1BH","L",0,0,null,null,20
      

      【讨论】:

      • 我通过将 csv 类中的数据解析为 DataTable 类并对值进行一些数据验证来实现它。直接保存DataTable。它工作得很好而且速度很快,但如果 csv 库直接支持它会很好,所以我已经给作者发了电子邮件询问它。
      【解决方案3】:

      我使用 Microsoft 文本驱动程序为项目导入 CSV 信息。它工作得很好。我定义了一个 Schema.ini 文件来指定列标题、数据类型、要扫描的行数(MaxScanRows=0,将扫描整个文件)。

      我没有尝试过,但是当您使用 Microsoft 文本驱动程序时,您会发出一个选择查询以从 csv 文件中提取数据,我想知道您是否可以添加条件来过滤掉空记录。

      How to populate IDataReader from .csv for use with SqlBulkCopy.WriteToServer(IDataReader)

      http://msdn.microsoft.com/en-us/library/windows/desktop/ms709353(v=vs.85).aspx

      http://www.connectionstrings.com/textfile

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 2019-07-08
        • 1970-01-01
        相关资源
        最近更新 更多