parsing - 使用 RowProcessor (Univocity) 解析固定宽度的文件
问题描述
我正在处理一个具有 3 种不同类型 bean 的固定宽度文件:
- Bean 1(标题):长度 = 256;以 0256Q 开头;一个单头
- Bean 2(记录):长度 = 768;以 0768T 开头;可重复的
- Bean 3(页脚):长度 = 256;以 0256Z 开头;一个页脚
我尝试了 Univocity 的许多选项,但问题是在解析步骤之后,processor.getBeans() 方法总是为每种类型的 bean 返回一个空列表。
有谁能够帮我 ?
FixedWidthParserSettings settings = new FixedWidthParserSettings();
settings.setAutoConfigurationEnabled(true);
settings.setHeaderExtractionEnabled(false);
settings.setRecordEndsOnNewline(true);
settings.trimValues(false);
FixedWidthFields header = FixedWidthFields.forParsing(Header0256Q.class);
FixedWidthFields payment = FixedWidthFields.forParsing(Payment0768T.class);
FixedWidthFields footer = FixedWidthFields.forParsing(Footer0256Z.class);
展望
settings.addFormatForLookahead("0256Q", header);
settings.addFormatForLookahead("0768T", payment);
settings.addFormatForLookahead("0256Z", footer);
为每种类型的记录创建一个处理器
BeanListProcessor<Header0256Q> headerProcessor = new BeanListProcessor<Header0256Q>(Header0256Q.class);
BeanListProcessor<Payment0768T> paymentProcessor = new BeanListProcessor<Payment0768T>(Payment0768T.class);
BeanListProcessor<Footer0256Z> footerProcessor = new BeanListProcessor<Footer0256Z>(Footer0256Z.class);
输入值开关
InputValueSwitch inputValueSwitch = new InputValueSwitch();
inputValueSwitch.addSwitchForValue("0256Q", headerProcessor);
inputValueSwitch.addSwitchForValue("0768T", paymentProcessor);
inputValueSwitch.addSwitchForValue("0256Z", footerProcessor);
settings.setProcessor(inputValueSwitch);
解析
FixedWidthParser parser = new FixedWidthParser(settings);
parser.parse(lFile);
获取豆子
List<Header0256Q> headerRecords = headerProcessor.getBeans();
List<Payment0768T> paymentRecords = paymentProcessor.getBeans();
List<Footer0256Z> footerRecords = footerProcessor.getBeans();
使用返回的 bean 映射文件
Dtazv dtazv = new Dtazv();
dtazv.setHeaderRecord(headerRecords.get(0));
dtazv.setPaymentRecords(paymentRecords);
dtazv.setFooterRecord(footerRecords.get(0));
解决方案
推荐阅读
- android - 如何在android studio的片段中使用documentReference
- alfresco - 如何创建自定义操作以更改内容类型属性值并添加用户权限
- sql - 如何使用Firebird DB查找数字是否可以包含在Delphi中的特定范围内?
- json - obj 的数组 JSON 到字符串
- docker - 覆盖由 bmuschko Gradle Docker 插件生成的整个默认 Dockerfile
- python - 如何从 JSON 响应 RobotFramework 获取所需参数
- python - Plotly:如何从两个数据框列绘制两条线并从其他两列分配悬停信息?
- swift - Xcode 中的“首选大标题”是否存在错误?
- c - 无法弄清楚 C 语言中的 scanf("%[^\n]\n", input) 会发生什么
- javascript - Javascript - 构造一个数组,其中的元素从字符串中重复