在批量导入到数据库期间处理csv中的空字段

时间:2012-10-08 14:28:56

标签: c# csv sqlbulkcopy idatareader

我正在从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并删除所有违规行。也许那里有一个更好的csv库.net?

3 个答案:

答案 0 :(得分:1)

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

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

查看我添加了null-coalescing运算符的位置?这应该改变你的输出:

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

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

答案 1 :(得分:0)

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

我没有尝试过这个但是当你使用Microsoft Text Driver时你会发出一个select查询来从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

希望这有帮助。

答案 2 :(得分:0)

为了处理空条目,我最终一次将csv解析为一个DataTable对象1000个条目,然后在我去的时候导入它们。