带有页眉和页脚的 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",这会引发异常。希望这有帮助。
我正在处理一个项目,我们收到一个平面文件,但第一行和最后一行的信息不符合固定宽度模式。有没有一种方法可以正确地对所有这些信息进行数据编织,如果可能的话,将页眉和页脚放入变量中,并将内容放在有效负载中。
示例文件
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",这会引发异常。希望这有帮助。