我每天都会收到来自外部公司的 csv,它为我们收集反馈。
无用的 csv 标题各不相同。可以有任何标题组合。例如:
第1天:标题1,标题2,标题3,标题4,标题5
第2天:标题1,标题2,标题4,标题6
第3天:标题1,标题2,标题7,标题8
第4天:标题1,标题2,标题3,标题4,标题5
我们有 18 个月的积压文件(直到现在还没有人对这些数据做任何事情),到目前为止,我发现了 22 种不同的组合......
我知道所有潜在的标题是什么,所以我可以拥有一个包含所有适当列的 SQL 表,但我正在努力处理导入的差异。
有没有办法在 SSIS 中处理这个问题?我看过 bcp 和 openrowset 但我似乎无法让它工作。
由于每天都会收到此文件,因此我需要一个 sql 作业,将它们导入我的表以进行报告。我只能创建一个将导入固定平面文件的 SSIS 包,但我需要它是动态的。最坏的情况是拥有 22+ 个不同的 SSIS 包并为给定的可用标题运行特定的 1,但是我需要一种自动读取 csv 结构的方法来决定使用哪个包。
我迷路了,所以有人有方向吗?
SQL 2016 (13.0.5622.0)
非常感谢
我会这样做:
存在一些必须将数据放入其中的工作表。它包含可能存在于 CSV 中的所有数据的列,具有正确的名称和数据类型。
创建包含 2 列的名称表:CSV 中使用的列名;根据工作表中的列名。喜欢
每列都被定义为唯一的。
从 CSV 文件加载第一行(文件重命名为某个预定义的名称或作为参数获取),将其解析为单独的名称,然后将它们添加到 CSV_name 中忽略重复错误,然后计算名称表中的名称数量在 table_name 中有 NULL。
如果有 CSV_name 行的 table_name 为 NULL,则过程会键入一条消息并中断。操作员查看名称表并用相应的值填充 table_name 列,然后再次调用该过程。
如果所有 CSV_name 都具有相应的 table_name,则过程会创建临时表并将整个数据加载到其中。数据加载后,该过程构建 INSERT INTO 查询文本并将数据复制到工作表中。或者,可以在一个步骤中创建/执行正确的导入查询文本。
考虑一个包含两个不同文件的简化场景,每个文件包含不同的数据子集。
abc.csv:
abd.csv:
现在,我们可以使用 PowerShell 将文件、
Select
列导入已知的、一致的数字和顺序,然后将其导出回带有可预测文件的 csv:这将生成两个具有通用、可预测文件格式的新文件。
abc_cleansed.csv:
abd_cleansed.csv:
注意:我在最初的 csv 文件中省略了双引号,PowerShell 也将它们添加到其中。您可以删除它们,但恕我直言,这绝对是数据质量的有益功能。
现在,您可以简单地构建一个数据管道,在其中获取输入文件,进行转换以清理格式,然后选择这些清理后的文件以导入它们。根据您的流程,您可以在单个 SSIS 包中完成所有这些操作,或者构建单独的数据清理/数据导入流程。
晚上好,朋友。您听说过有关 DBATools 的好消息吗?
Import-DbaCsv
可能是你的功能。不久前我写了一个补丁,它在某些约束下根据源和目标自动检测和映射列名。它可能正是您所需要的。