我正在从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?
答案 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个条目,然后在我去的时候导入它们。