【发布时间】:2020-07-16 02:44:07
【问题描述】:
我有一个通常具有以下格式的文件:
property_A_1@property_B_1@property_C_1@property_D_1
property_A_2@property_B_2@property_C_2@property_D_2
property_A_3@property_B_3@property_C_3@property_D_3
这应该映射到具有四个属性的自定义类,@ 作为分隔符。但是,在某些情况下,property_B 可能包含一个新行作为其字符的一部分,例如:
property_A_1@property_B_1@property_C_1@property_D_1
property_A_2@property_B_2_i
property_B_2_ii
property_B_2_iii
property_B_2_iiii@property_C_2@property_D_2
property_A_3@property_B_3@property_C_3@property_D_3
这些行的数量可以变化并且不是固定的。在这种情况下,我仍然需要像以前一样映射第二个条目,除了 property_b_2 应该包含第一个 @ 和第二个 @ 之间的数据。
如果我可以用空格替换它们,我可以不用换行,所以假设实际条目看起来像:
property_A_2@property_B_2_i property_B_2_ii property_B_2_iii@property_B_2_iiii@property_C_2@property_D_2
有没有办法通过ItemReader 和LineMapper 来实现这一点?
【问题讨论】:
-
嗨,马哈茂德。不幸的是,切换到
DefaultRecordSeparatorPolicy并没有帮助,因为它仍然会在到达行尾并以引号终止时考虑记录。我需要一个分隔符策略来计算@s 的数量,因为它是一个固定数字,例如3(当然,还要考虑最后一个@之后的属性[参见上面的示例])。也就是说,我相信关键是要覆盖DefaultRecordSeparatorPolicy#preProcess()来自定义isContinued。但是,我不确定如何使用这种方法跟踪@。 -
默认的继续符是反斜杠。您是否将其设置为“\n”?见docs.spring.io/spring-batch/docs/4.2.x/api/org/springframework/…。请注意,默认策略适用于默认用例。您可能需要针对特定用例的自定义记录分隔符策略。
标签: java spring parsing spring-batch batch-processing