【问题标题】:Validating CSV file prior to import into SQL Server在导入 SQL Server 之前验证 CSV 文件
【发布时间】:2012-09-12 08:44:06
【问题描述】:

我知道围绕这个主题还有其他主题,但它们并不像我的需求那么具体(目前我可以找到)。

我有 csv 文件要导入到我管理的 SQL Server 数据库中。它们是人工拼凑而成的,因此可能会出现列过多、数据类型不正确、标题损坏等错误。

我有一个 Web 表单,它可以从用户接收文件到服务器上的目录,然后它将一行作为字符串读取,逐个单元格地解析它,并执行诸如检查正确的单元格计数是否存在之类的事情,然后移动到下一行。

现在开始验证数据类型和范围,我不清楚最佳方法。对数字类型进行手动范围检查之类的操作似乎有点过时了。

有没有更好的方法?几件事;

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

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

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

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

提前致谢。

【问题讨论】:

  • 如果您的数据存储是 SQL Server,我觉得您应该使用 SSIS。创建一个 SSIS 包并尝试使用 C# codeproject.com/Articles/28096/… 执行 SSIS 包,这将负责将列映射到特定数据类型。
  • 网站是 MVC3 吗?如果是这样,请查看模型/视图模型和数据/验证注释。然后,您可以创建一个新的 ObjectX,从 CSV 行填充并验证它 - 确定该行(整个对象)和属性是否有效,相应地报告并在合适的情况下保存。
  • 这只是一个标准的 ASP.Net C# Web 应用程序。我希望在 webapp 本身中保留验证,这样我就不会受到数据库中断和/或维护窗口的阻碍。在 C# 代码中有更好的方法吗?

标签: c# sql-server validation parsing csv


【解决方案1】:

我建议使用批量复制。 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)

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

为了报告错误行,我通常在阶段表行上使用标志来标记不同类型的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    相关资源
    最近更新 更多