【问题标题】:How to import into CSV file into SQL Server with different number of column?如何将CSV文件导入具有不同列数的SQL Server?
【发布时间】:2013-02-14 18:37:58
【问题描述】:

我们想再次探索使用 SQL SSIS 2005 导入,其中 CSV 文件的每行分隔的列数不同。即。

假设前 3 行:

"1", "FirstName1", "LastName1"
"2", "FirstName2", "LastName2"
"3", "FirstName3", "LastName3"

4-5 行:

"210", "Crows st", "Melbourne", "VIC"
"212", "Cr st", "Melbourne", "VIC"

其他:

"100", "Activities 1"
"101", "Activities 2"

我们所做的唯一方法是,如果数据少于 100 万行,我们可以导入 Excel,然后导出为 CSV 或制表符分隔并导入 SQL Server。 或者,如果超过 100 万条记录,我们可以导入 Ms Access 2007/2010 并重新导入 SQL(假设数据不超过 2GB)。这些类型的解决方案效果很好!!!

有没有直接针对 SQL 的解决方案?我们仍在使用 Ms SQL Server 2005 BTW。我们之所以问,是因为 Ms Access 的大小有 2GB 的限制,而我们的数据超过 2GB !!!当然,我们可以根据行数拆分这个文件,但我们发现非常混乱。

期待输入。

谢谢

【问题讨论】:

  • 第 1-3、4-5 和 6 行之间是否存在必须维护的关系?
  • 数据相关。像这样认为我们从供应商那里获得的数据就是这样 - 他们基本上将几个表转储到 1 个文件中。我们无法访问实际来源 - 因此我们必须处理这些组合数据。
  • 它是相关的,但我们是否需要将第 1 行与“Crows St”行联系起来,如果是这样,我们可以使用那个前导数字,还是这将是第 1 行的序数位置A 部分的第 1 行与 B 部分的第 1 行等相关吗?
  • 您为什么不编写一个简单的 C# 命令行应用程序来解析文件并根据有多少列构建适当的语句?我假设这些数据将进入不同的表?
  • 其实这个练习的目的是把这个文件转储到一张表中。然后我们将手动分析数据 - 所以数据的关系是不关心的。分析师可能会根据行 x 到 y 查询数据,这意味着等等 - 他们必须自己标记。

标签: sql-server sql-server-2005 ssis


【解决方案1】:

由于文件中的三组数据似乎是三个不同的实体(客户、地址、活动),我假设您希望在流程结束时将它们放入三个不同的表中。这意味着无论如何都会发生拆分数据,这只是您在加载过程中在哪里进行拆分的问题。

我的方法是使用一个小脚本(Python、Perl、PowerShell 等)将文件拆分为三个单独的文件。您可以从 SSIS 包中调用脚本,以将所有工作流集中在一个位置。之后,您只需将三个连接器添加到您的包并将数据加载到您想要的任何表中。

【讨论】:

  • 我们的任务只是将数据转储到 SQL 中的 1 个表中。然后分析师将用数据做一些时髦的事情——这不是我们关心的。但是我们需要知道替代方法,因为据我们所知,我说过 SQL SSIS 2005 不能直接导入它。
  • 即使在这种情况下我仍然会拆分文件,加载三个一致的文件比一个“混合”的文件更容易(至少使用 SSIS)。但是做事的方法不止一种,所以其他人可能有你更喜欢的替代方法。
【解决方案2】:

您可以做到,但这很复杂,我能做的最好的事情就是为您指明正确的方向。它涉及使用源类型的脚本组件和指向每个不同目标的条件拆分。脚本组件将读取数据并创建源行。这样做时,它会创建一个名为“RowType”的额外列,供条件拆分对象使用。

希望能有所帮助,祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多