【问题标题】:Optional Multi-line Entry for Spring Batch LineMapperSpring Batch LineMapper 的可选多行条目
【发布时间】: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

有没有办法通过ItemReaderLineMapper 来实现这一点?

【问题讨论】:

  • 嗨,马哈茂德。不幸的是,切换到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


【解决方案1】:

我通过覆盖我的ItemReaderDefaultRecordSeparatorPolicy#isEndOfRecord() 解决了这个问题。我还需要阅读未终止的引号检查,因为内容可能有一对不均匀的引号字符:

itemReader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy() {

    private static final String CONTINUATION = "\\";

    private String continuation = CONTINUATION;
    private String final String delimiter ="@";

    @Override
    public boolean isEndOfRecord(String line) {
        return StringUtils.countOccurrencesOf(line, delimiter) >=3 &&
               !isQuoteUnterminated(line) && 
               !isContinued(line);
    }

    private boolean isQuoteUnterminated(String line) {
        return false;
    }

    private boolean isContinued(String line) {
        if (line == null) {
            return false;
        }
        return line.trim().endsWith(continuation);
    }
});

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2020-07-19
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多