比较文件和报告统计信息中的记录 - 场景2

时间:2009-05-20 22:45:56

标签: perl comparison

要求是:

事实1:我们有遗留系统生成的一些数据文件

事实2:我们有一些新系统生成的数据文件应该最终取代传统的

事实3:

  1. 这两个文件都是文本/ ASCII文件, 记录由组成 多行。
  2. 记录中的每一行都包含在内 of fieldname和fieldvalue。
  3. 这些行的格式 提出的是1之间的不同 和2,但是fieldname和fieldvalue 可以从每一行中提取 通过使用正则表达式
  4. 字段名称可以在1和之间更改 2,但我们有一个映射 与他们联系
  5. 每条记录都有唯一的标识符 这有助于我们将遗产联系起来 记录新订单作为订购 输出文件中的记录需要 两个系统都不一样。
  6. 要比较的每个文件至少为 10 MB到平均情况30 - 35 MB
  7. 事实4:当我们迭代构建新系统时,我们需要在完全相同的条件下比较两个系统生成的文件并协调差异。

    事实5:这种比较是使用昂贵的视觉差异工具手动完成的。为了解决这个问题,我编写了一个工具,将两个不同的字段名称放在一个通用名称中,然后在每个文件中对每个记录中的字段名称进行排序,以便它们按顺序同步(新文件可以有多余的字段在视觉差异

    事实6:由于比较是由人类手工完成的,而人类犯错误,我们会得到虚假的姿势和负面因素,这会严重影响我们的时间表。

    显然问题是,“ALG”和“DS”应该是什么?

    我必须解决的方案:

    我想构建一个

    的PERL程序
    1. 从两个文件中读取相关信息 进入数据结构'DS'
    2. 处理并找出差异 使用算法'ALG',之间 来自DS的记录
    3. 显示/报告统计信息 最终用户,就像多少行一样 (值)之间存在差异 记录,它们的区别或不同 价值观完全不同,是 缺少行(来自新系统的文件) 可以有额外的字段,但他们必须 包含所有行 遗留产生的文件 系统)
    4. 我的建议:

      DS:多个嵌套哈希绑定到磁盘。

      看起来像:

      $namedHash { unique field value across both records } = {
      
          legacy_system => {
      
              'goodField' => 'I am good!',
              'firstField' => 1,
              'secondField' => 3
          },
      
          new_system => {
      
              'firstField' => 11,
              'secondField' => 33,
              'goodField' => 'I am good!'
          }
      };
      

      ALG:自定义键 - 通过legacy_system和new_system键指向的匿名哈希之间的键比较。通过插入新的密钥“差异”将记录下任何差异,这些差异将是旧系统和新系统之间不同的字段名称数组。

      因此,对于这个例子,我的ALG的输出将是:

      $namedHash { unique field value across both records } = {
      
          legacy_system => {
      
              'goodField' => 'I am good!',
              'firstField' => 1,
              'secondField' => 3
          },
      
          new_system => {
      
              'firstField' => 11,
              'secondField' => 33,
              'goodField' => 'I am good!'
          },
      
          differences => [firstField, secondField];
      };
      

      在这种情况下你会做什么/建议什么?

1 个答案:

答案 0 :(得分:1)

为什么不将所有数据导入SQLite数据库。您只需要一个表,其中一个主键对应于两个系统共有的唯一标识符。列应该是旧字段和新字段的并集。

首先导入一个数据集,说出新系统生成的集合。然后,对于旧版集中的每个项目,请尝试对表中相应条目的UPDATE:如果UPDATE失败,您知道新数据集缺少旧系统中曾经存在的那些条目。

如果与旧数据相对应的任何列都有NULL,那么您就知道旧系统中遗留系统中不存在的条目。

然后,您可以选择新系统中任何列与旧系统中相应列不匹配的行。

恕我直言,这比基于哈希表的系统更灵活。