我正在处理一个项目,我们收到一个平面文件,但第一行和最后一行的信息不符合固定宽度模式。有没有办法正确地对所有这些信息进行数据编织,如果可能的话,将页眉和页脚放入变量中,并将内容放在有效载荷中。
示例文件
HDMTFSBEUP00000220170209130400 MT HD07
DT01870977 FSFSS F3749261 CR00469002017020820170225 0000
DT01870978 FSFSS F3749262 CR00062002017020820170125 0000
TRMTFSBEUP00000220170209130400 000000020000002000000000000043330000000000000 0000
我知道对于CSV,你可以跳过一行,但是看不到它有固定的宽度,而且页眉和页脚都会以前两个字母开头,所以也许它们可以通过dataweave过滤?
答案 0 :(得分:2)
请参阅DataWeave Flatfile Schemas文档。处理几种不同类型的数据有几个例子。
在这种情况下,我尝试简化您的示例数据,并应用自定义架构,如下所示:
示例数据:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_filter_category);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
//back button action
toolbar.setNavigationOnClickListener(view -> finish());
}
}
架构/平面文件定义:
HDMTFSBEUP00000220170209130400
DT01870977
DT01870978
TRMTFSBEUP00000220170209130400
架构将验证示例数据,并根据标记标识前2个字母。输出将相应地分组。
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": {}
}
。
答案 1 :(得分:0)
使用范围选择器跳过页眉和页脚。
payload[1..-2] map {
field1: $[0..15],
field2: $[16..31]
...,
...
}
[1..-2]
将从第2行选择,直到有效载荷中的第二行。
$[0..15]
将从第1列索引到第16个索引进行选择。 $[16..31]
从第17列索引到第32索引进行选择。
答案 2 :(得分:0)
我遇到了同样的问题,@ sulthony h写的答案需要一些调整。我用这些线代替它,它对我有用。
data:
- { idRef: 'header', count: 1 }
- { idRef: 'data', count: '>1' }
- { idRef: 'footer', count: 1 }
页眉和页脚中缺少“count”,这就是抛出异常。希望这会有所帮助。