带有页眉和页脚的 Mule Dataweave 固定宽度文件

Mule Dataweave Fixed Width File with header and footer

我正在处理一个项目,我们收到一个平面文件,但第一行和最后一行的信息不符合固定宽度模式。有没有一种方法可以正确地对所有这些信息进行数据编织,如果可能的话,将页眉和页脚放入变量中,并将内容放在有效负载中。

示例文件

HDMTFSBEUP00000220170209130400           MT                                                     HD07
DT01870977         FSFSS   F3749261            CR00469002017020820170225                        0000
DT01870978         FSFSS   F3749262            CR00062002017020820170125                        0000
TRMTFSBEUP00000220170209130400  000000020000002000000000000043330000000000000                   0000

我知道对于 CSV,您可以跳过一行,但看不到固定宽度的行,而且页眉和页脚每次都会以前 2 个字母开头,所以也许可以通过 dataweave 过滤它们?

请参考DataWeave Flatfile Schemas文档。有几个例子可以处理几种不同类型的数据。

在这种情况下,我尝试简化您的示例数据,并按如下方式应用自定义架构:

示例数据:

HDMTFSBEUP00000220170209130400           
DT01870977         
DT01870978         
TRMTFSBEUP00000220170209130400  

Schema/Flat 文件定义:

form: FLATFILE
structures:
- id: 'test'
  name: test
  tagStart: 0
  tagLength: 2
  data:
  - { idRef: 'header' }
  - { idRef: 'data', count: '>1' }
  - { idRef: 'footer' }
segments:
- id: 'header'
  name: header
  tag: 'HD'
  values:
  - { name: 'header', type: String, length: 39 }
- id: 'data'
  name: data
  tag: 'DT'
  values:
  - { name: 'code', type: String, length: 17 }
- id: 'footer'
  name: footer
  tag: 'TR'
  values:
  - { name: 'footer', type: String, length: 30 }

架构将验证示例数据并根据 标签 的前 2 个字母进行识别。输出将相应地分组。

{
  "header": {},
  "data": [{}, {}],
  "footer": {}
}

既然预期的结果只是数据,那么就select吧:payload.data.

使用范围select或跳过页眉和页脚。

payload[1..-2] map {
   field1: $[0..15],
   field2: $[16..31]
   ...,
   ...
}

[1..-2] 将从第 2 行到负载中的倒数第二行 select。

$[0..15] 将从第 1 列索引到第 16 列索引 select。 $[16..31] select 从第 17 列索引到第 32 列索引。

我遇到了同样的问题,@sulthony h 写的答案需要稍微调整一下。我改为使用这些行,它对我有用。

data:
  - { idRef: 'header', count: 1 }
  - { idRef: 'data', count: '>1' }
  - { idRef: 'footer', count: 1 }
页眉和页脚中缺少

"count",这会引发异常。希望这有帮助。