如何在Informatica PowerCenter中使用单个映射处理具有不同但相似格式的多个文件?

时间:2015-01-28 20:21:38

标签: etl informatica informatica-powercenter

我想将一些文件整合到一个数据库表中。文件具有相似但不同的格式。文件看起来像这样:

FileOne:

  • ColA:string
  • ColB:string
  • ColC:string

FileTwo传送:

  • ColAA:string
  • ColBB:string
  • ColCC:string

FileThree:

  • Col01:string
  • Col02:string
  • Col03:string

目标表如下所示:

TableDestination:

  • ColFirst:string
  • ColSecond:string
  • ColThird:string

我想开发一个映射,将这三个文件ETL到这个数据库中,但由于列名不同,看起来我必须开发三种不同的映射,或三种不同的源,或三种不同的出头。问题是我的例子是人为的:我实际上有许多不同的文件都有不同的格式和列名,但数据都非常相似。

我想开发一个单一的映射或工作流,只需添加一个包含列映射的表即可处理所有这些。根据上面的示例文件和示例表,这样的表看起来像这样:

使用TableMappings:

TableMappings

通过这种方式,要编辑列映射,我只需要对此TableMappings表进行编辑。我不必对映射或工作流程进行任何更改。我也不必重新部署申请。

地图或工作流程看起来会是什么样才能利用这样的东西?我假设它是一个平面文件源,从文件夹中获取文件。中间会有一些东西使用这个TableMappings表来映射列名。最后会有一个关系数据对象代表我的目标数据库表" TableDestination"。我不知道怎么把它放在一起。

2 个答案:

答案 0 :(得分:1)

Flat Files作为来源,列名称并不重要。如果列数匹配则无关紧要。如果实际文件将包含更多列Source Definition,则只会读取前n列(n为Source Definition中的端口数)。在相反的情况下,额外的端口将包含空值。

话虽如此,加载多个平面文件很容易。

问题是如果列顺序不同并且您希望这个额外的静态表定义列映射。这是可行的,即Java Transformation可用于进行列映射。但是整个解决方案对我来说太复杂了。我可以尝试回答一些精确的,具体的问题 - 但我无法准备和粘贴完整的解决方案。

答案 1 :(得分:0)

这也可以使用表达式完成。您需要一个“通用”Source Definition(例如Column1Column2,...,ColumnN),并在每个端口中都有一个表达式,用于检查应返回哪个端口。 E.g。

DECODE (SUBSTR(TargetColumnOrder,X,1), '1', Column1, '2', Column2, ... 'N', ColumnN)

以X为端口索引。

以上假设映射表的结构有点不同:

FileName | TargetColumnOrder
----------------------------
FileOne  | 231
FileTwo  | 527

注1:如果列数不同,则需要检查Length(TargetColumnOrder)是否不小于端口索引,否则SUBSTRING将无效。

注2:上述解决方案尚未经过测试甚至未实施。请将此视为一般性描述,而不是确切的代码库。