0

我正在管理一个开发项目,该开发项目从各种数据源(SQL MySQL、Filemaker、excel)中提取数据,然后安装到具有 10 年记录库的新数据库结构中。显然,我需要在导出之前清理所有这些,并且想知道是否有任何应用程序可以为我简化此过程,或者我可以遵循的任何指南。

任何帮助都会很棒

4

5 回答 5

2

我一直这样做,就像 Tom 在 SQl Server 中使用 DTS 或 SSIS 一样,这取决于最终数据库的版本。

我强烈推荐的一些东西:

在处理之前存档所有收到的文件,特别是如果您从外部来源获取这些数据,您可能需要研究旧的导入并返回原始数据。归档成功后,将文件复制到处理位置。

特别是对于大文件,获取某种标志文件是有帮助的,该标志文件仅在另一个文件完成后才被复制,或者更好的是它包含文件中的记录数。这有助于防止文件损坏或不完整造成的问题。

如果文件大小或记录数量可疑,请保留记录数量的日志并开始使您的工作失败。如果您发现更改是正确的,请输入一种处理方法。有时他们确实打算将文件切成两半,但大多数时候他们没有。

如果可能,在文件中获取列标题。您会惊讶于数据源在没有预先警告和中断导入的情况下更改列、列名或列顺序的频率。如果您有列标题,则在处理数据之前更容易检查这一点。

切勿直接导入生产表。最好使用暂存表,您可以在其中检查和清理数据,然后再将其放入产品中。

记录流程的每个步骤,以便您轻松找到导致失败的原因。

如果您要清理大量文件,请考虑创建函数来执行特定类型的清理(例如电话号码格式),那么您可以在多个导入中使用相同的函数。

Excel 文件是邪恶的。查找在导入过程中去除了前导零的地方。

我编写了我的流程,因此我可以将它们作为测试运行,并在最后进行回滚。这样做比意识到您的开发数据如此混乱以至于您甚至无法进行有效测试以确保所有内容都可以转移到产品中要好得多。

在没有先在 dev 上进行的情况下,永远不要在 prod 上进行新的导入。当您开始新的导入时直接观察记录(当然,如果它是一个大文件,则不是全部,但一个很好的采样)。如果您认为您应该获得 20 列并且它第一次导入为 21 列,请查看最后一列中的记录,这通常意味着制表符分隔的文件在数据的某处有一个制表符,并且列数据为此关闭记录。

不要假设数据是正确的,先检查一下。我在姓氏列中有名字,在邮政编码列中有电话等。

检查无效字符、应该只有数字的字符串数据等。

只要有可能,就从提供数据的人那里获取标识符。把它放在一个链接到你的标识符的表中。由于姓氏已更改或地址已更改,这将使您免于重复记录。

还有更多,但这应该让您开始考虑构建流程以通过不导入不良数据来保护公司的数据。

于 2009-05-14T21:08:13.640 回答
0

在类似的情况下,我个人发现 Emacs 和 Python 非常有用,但我想,任何具有良好搜索功能的文本编辑器和具有强大字符串操作功能的语言都应该可以胜任。我首先将数据转换为纯文本文件,然后

  1. 眼球要么是整个数据集,要么是具有代表性的真实随机数据样本。
  2. 基于此,对不同的列进行猜想(“不允许空值”、“仅包含值 'Y' 和 'N'”、“'开始日期'总是在 '结束日期'之前”等)。
  3. 编写脚本来检查猜想。

显然,这种方法往往一次只关注一个表,因此只能补充将数据上传到关系数据库后所做的检查。

于 2009-05-14T21:36:31.590 回答
0

对我有用的一个技巧是找到一种方法,让每种类型的数据源一次以制表符分隔的形式输出单个列和唯一标识符,这样您就可以使用文本工具清理它( sed、awk 或 TextMate 的 grep 搜索),然后重新导入它/更新(副本!)原始源。

然后清理多个来源变得更快,因为您可以在它们之间重复使用工具(例如,大写姓氏 - McKay、O'Leary o'Neil、Da Silva、Von Braun 等、修复日期格式、修剪空白) 并在某种程度上自动化该过程(取决于来源)。

于 2009-07-05T22:01:36.857 回答
0

我主要使用 Microsoft SQL Server,这就是我的专长所在,但 SSIS 可以连接到相当多的数据源,并且非常适合 ETL 工作。即使您的数据源实际上都不是 MS SQL Server,您也可以使用它。也就是说,如果您不使用 MS SQL Server,那么可能会有一些更好的方法。

要提供一个非常好的答案,您需要有一个完整的数据源和目标列表,以及您可能需要完成的任何特殊任务以及运行转换的任何要求(它是一次性的吗?交易还是您需要能够安排它?)

于 2009-05-14T20:11:53.887 回答
0

不确定工具,但您将不得不处理:

  • 同步生成的密钥

  • 同步/规范化数据格式(例如不同的日期格式)

  • 同步记录结构。

  • 孤儿记录

如果在您开发此过程或移动数据时数据正在运行/正在更新,您还需要捕获更新。过去,当我不得不做这种事情时,最好但不是很好的答案是开发一组在多次迭代中运行的脚本,这样我就可以在移动之前迭代地开发和测试流程的数据。我发现拥有一个可以清理/重建目标数据库的脚本(我使用了模式和 ant 脚本,但它可以是任何东西)很有帮助。您也可能需要某种方式来记录脏/不匹配的数据。

于 2009-05-14T20:12:57.533 回答