2017-03-15 123 views
0

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

示例文件

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

我知道CSV你可以跳过一条线,但没有看到它有固定的宽度,也页眉和页脚都将与前两个字母,每次所以也许他们可以开始通过dataweave过滤?

回答

1

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

在这种情况下,我试图简化您的示例数据,并应用自定义模式如下:

示例数据:

HDMTFSBEUP00000220170209130400   
DT01870977   
DT01870978   
TRMTFSBEUP00000220170209130400 

模式/平面文件定义:

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 } 

该模式将验证示例数据,并根据标签(前两个字母)进行标识。输出将被相应分组。

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

由于预期的结果仅仅是数据,然后选择它:payload.data

0

使用范围选择器可以跳过页眉和页脚。

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

[1..-2]将从第2行选择到有效载荷中的第二行。

$[0..15]将从第1列索引到第16索引中进行选择。 $[16..31]选择从第17列索引到第32索引。

0

我正面临同样的问题,@sulthony h写的答案需要一些调整。我用这些线代替它,并为我工作。

data: 
    - { idRef: 'header', count: 1 } 
    - { idRef: 'data', count: '>1' } 
    - { idRef: 'footer', count: 1 } 

页眉和页脚中缺少“count”,这是抛出异常。希望这可以帮助。