在导入SQL Server之前验证CSV文件

时间:2012-09-12 08:44:06

标签: c# sql-server validation parsing csv

我知道围绕这个主题还有其他线索,但它们并不像我的需要那样具体(我到目前为止都能找到)。

我有csv文件导入我管理的SQL Server数据库。它们由人类组合在一起,因此可能会出现错误,例如列数太多,数据类型不正确,标题损坏等等。

我有一个Web表单,可以从用户接收文件到服务器上的目录,然后以字符串形式读取一行,逐个单元地解析它,并执行检查正确的单元格计数等操作,然后移动到下一行。

现在验证数据类型和范围,我不清楚最好的方法。像数字类型的手动范围检查这样的事情看起来有点过时了。

有更好的方法吗?一些事情;

  1. 我有SQL Server类型,如“numeric”,但也有nvarchar。

  2. 文件可以小到几千字节,也可以大到一千兆字节。

  3. 我需要报告存在错误的每个特定行和列,而不仅仅是行x失败。

  4. 我想可能尝试将单元格值转换/转换为预期类型,捕获异常并将数据拆分为块并生成线程以并行执行检查?

    提前致谢。

1 个答案:

答案 0 :(得分:1)

我建议使用bulc copy。 SSIS要复杂得多且容易出错(在正常情况下也要慢得多......)。

通常,您知道您期望哪些列,并且您希望为具有正确格式的导入数据创建“导入阶段表”。如果完整文件不符合TSQL中的最低要求(列数)(在bulc插入周围使用“try / catch”),则可以拒绝该文件。

初始导入后可以进行转换和类型检查。为此,在阶段表中使用正确格式的其他列可能很有用。例如。您可以导入到nvarchar列并转换为十进制值。这里的技巧是使用视图:在视图下面的示例中,“myImportTable_InsertView”仅选择舞台表中的导入列(舞台表有更多列进行类型检查)

    DECLARE @SQLString nvarchar(4000) =

    INSERT dbo.myImportTable_InsertView
    FROM ''' + @FullFilename + ''' WITH
    (
    FIELDTERMINATOR = '';'',
    ROWTERMINATOR = ''\n'',
    CODEPAGE= ''RAW''
    )'
    Exec (@SQLString)

完成所有验证后,您只需将舞台表中的数据复制到其最终目的地。

要报告错误行,我通常在舞台表行上使用标记来标记不同类型的错误。