【问题标题】:Starting project with 100s of data conversions into a SQL database. What is the correct way?启动项目,将 100 多个数据转换为 SQL 数据库。正确的方法是什么?
【发布时间】:2013-03-12 19:46:09
【问题描述】:

我们将有大约 200 个文件(csv、excel、PDF、屏幕抓取)都需要进入 SQL 数据库。所以大多数数据源都会有一个独特的过程

到目前为止,我们只有两个想法:

  1. 编写代码以根据需要以编程方式加载每个数据源,并编写代码以根据需要插入(这是一种简单的方法,但可能最耗时)

  2. 为每个文件编写一个 XML 映射,将列从源映射到目标 SQL DB 的列/表。但是编写代码来解释这个自定义 XML 映射文件会变得复杂吗?

我们应该考虑其他任何工具或方法吗?我虽然也许 SSIS 可以以某种方式提供帮助?这似乎是 BizTalk 的项目类型,对吗?不过太贵了。。

【问题讨论】:

  • 所有数据类型的插入代码应该是相同的,所以你只需要将每种类型解析成一个通用的结构。另请注意,Excel 文件可以导出为 CSV,您的某些其他数据类型也可能如此。
  • 是的。这也是一个想法。但是所有数据的目的地以不同的方式去不同的地方,所以它不像我有很多数据源只有一个数据目的地
  • 那么您需要为每种数据输入类型配备一个解析器,为每种输出类型配备一个编写器,并且某些输入类型可能会自动转换。
  • 我并不是说这适用于你,但根据我的经验,人们通常会花费数周时间来尝试找到一种“通用”的方式来导入他们的数据,而他们本可以花费更少的时间来做为每个数据源编写一个转换脚本的工作。尤其是当您拥有非常异构的数据时,通常一开始并不清楚通用解决方案是否可能,因此通常最好使用您喜欢的语言和工具“只做”,并且这样做您将处于更好的位置确定重构常见转换和任务的方法。
  • 我倾向于用一种不太优雅的编码方式来实现它。在我做了几次之后,我做了很多剪切和粘贴,而不是自豪地炫耀的代码,但它会是完成与尝试创建一些需要大量时间并最终变得脆弱的解决方案

标签: sql-server ssis dts data-conversion


【解决方案1】:

正如 Pondlife 所提到的,在现实世界的解决方案中,随着需求的全部复杂性被揭示出来,程序化解决方案通常变得越来越难以维护和支持。这在前面通常并不明显。

我会选择一个好的 ETL 工具 - SSIS 通常是目前平衡典型标准的最佳选择。然后,您需要预算一定数量的人工日来处理每个输入。对于一个非常简单的输入,您最快可能会实现每个文件 0.5 个工作日(包括设计、构建和单元测试)。

您可以通过复制您的第一个包作为其他包的起点来节省一些时间。

对于像这样的“原始”输入,我通常只需将未更改的数据加载到暂存表中即可启动每个包。此时我将每一列加载为 unicode 文本。然后后续的数据流或数据包可以提取该数据并交付它。这种方法确实加快了调试、测试和审计的速度——一旦您信任您的文件加载,您就可以使用 SQL 查询暂存表。

顺便说一句,SSIS 包实际上是一个描述输入、转换和输出要求的 XML 文档 - 类似于您的第 2 点。

【讨论】:

  • SSIS 与代码混合存在哪些问题?是否像创建包一样简单,创建代码发送到包的参数并将运行包所需的代码和 DLL 移动到服务器。 .基本上是这样吗?
  • id 喜欢做 2 合 1.. 我的意思是例如.. 一些来源是 .xls 所以让 SSIS 将其转换为表格并将其移动到决赛桌...我需要了解有关 SSIS 的更多信息。我在 64 位系统上读取 .xls 文件时遇到了一些问题
  • @punkouter 第一条评论:有一个部署向导需要通过,但它非常简单。 SQL 2012 在这方面是一个巨大的改进。
  • @punkouter 第二条评论:单个 SSIS 包可以包含具有复杂约束的多个任务(可视化设计器)。 xls 文件在 64 位上很笨拙,但可以使用 Access 数据库引擎驱动程序来完成。
【解决方案2】:

没有普遍的正确方法。只对您的具体情况更容易才重要。我会选择阻力最小的路径。这意味着如果某些文件更容易用 xml 映射(可能是 csv、excel 等),我会为这些文件使用 xml 映射。对于 xml 映射不起作用的其他人,我会选择其他东西。

现实情况是,某些方法更适用于一种类型的数据源,而另一些方法更适用于另一种类型的数据源。

【讨论】:

  • 我在考虑可以使用 XML 映射文件的真正直截了当的文件。但是这些文件每年只运行一次,放置参数真的有那么大吗用代码而不是 XML ......我很想使用 SSIS 做一些事情,除了在代码中做这一切之外,我还要深入研究 SSIS 必须完成的事情......
  • 嗯....如果它不是您更频繁地执行的事情,那也没关系.... ;)
【解决方案3】:

Perl。只需破解每种文件类型以生成适合 bcp 加载到数据库中的分隔文件。通常情况下,您甚至可以在 Perl 中使用正则表达式从 XML 文件中获取内容,但是如果您了解 XML 并且输入确实格式良好,那么 Perl 有很多解析器可以将正确的 XML 转换为正确的数据。 ;-)

Windows 上的 Perl 也将通过 Ole 自动化 Excel。去过那里,做到了,工作与预期一样好。将文件另存为文本。也许迭代它来修复它。根据需要重复。

我不同意这种事情不适合编程,正如其他人所建议的那样。它不是完美的,但可以渐近地减少错误,而手动过程并非如此。

将您的脚本、输入和输出都保存在不同的目录中。这样,您可以使用 Perl(或其他)来计算文件并验证转换。如果你对你的名字和扩展名很小心,很容易看出还有什么要做。让您的脚本适用于所有内容,包括加载数据库,以便您可以在任何时候以幂等方式重新运行它。在您注意到数据库中的数据存在只能通过调整解析器来解决的问题之后,非常令人满意。

黑客愉快。

【讨论】:

    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多