我在一家公司工作,我们经常为开始使用我们产品的新客户进行进口。有时我们收到的文件中有很多损坏的数据,比如一个特定的列,预计会包含这样的时间
TIME
----------
17:12:55
22:32:38
12:16:56
但是有些行除了之类的实际数据之外,还保存了一些无用的数据
TIME
----------
17:12:55
22:32:38kldjfakdfhehdkdfjdkff
12:16:56
它发生在多列和多行中。对于某些行,附加了无用的数据,而对于某些行则进行了预处理。我的问题是,这些损坏的数据是否可以被过滤,我们是否可以成功导入文件,或者这些文件是无用的,我们应该向我们的客户要求新的文件。
在我的前公司,我们编程了一个C#脚本,即使CSV已损坏,也可以导入。基本上,我们将逐行、逐列导入到一个暂存表中。如果一行被破坏了一半,我们就尽可能多地导入。随后,数据质量检查被应用到SQL中。像这样,可以导入从我们的客户端收到的所有垃圾CSV文件,而不会总是有失败的SSIS导入。
因此,如果你有时间和耐心,你可以写一个类似的C#导入(网上有很多例子)。我们的导入是通用的,因此每个可能的文件都可以使用相同的脚本导入,该脚本是在SQL表中定义的文件的业务逻辑(列映射)。
这样的暂存表:
CREATE TABLE [Staging].[FilesStaging](
[FilesStagingID] [int] IDENTITY(1,1) NOT NULL,
[ProcessingID] [int] NULL,
[ImportProcessingID] [int] NOT NULL,
[ProcessingTypeID] [smallint] NOT NULL,
[FileName] [varchar](255) NULL,
[ExcelSheet] [varchar](255) NULL,
[Col1] [varchar](255) NULL,
[Col2] [varchar](255) NULL,
[Col3] [varchar](255) NULL,
[Col4] [varchar](255) NULL,
[Col5] [varchar](255) NULL,
[Col6] [varchar](255) NULL,
[Col7] [varchar](255) NULL,
[Col8] [varchar](255) NULL,
[Col9] [varchar](255) NULL,
[Col10] [varchar](255) NULL,
[Col11] [varchar](255) NULL,
[Col12] [varchar](255) NULL,
[Col13] [varchar](255) NULL,
[Col14] [varchar](255) NULL,
[Col15] [varchar](255) NULL,
...