Apache Camel:从文件中删除特定行而不检查每一行

Apache Camel: Remove specific lines from a file without checking each line

在我的算法中,我逐行读取一个大文件(只是一种简单的 .txt 格式)并将文件的每一行转换为一个对象。

@Override
    public void configure() {
        from("file:from/")
                .split(body().tokenize("\n"))
                .streaming()
                .process(handle());
    }

    private Processor handle() {
        return exchange -> {
            final String body = exchange.getIn().getBody(String.class);
            // convert to DTO
            System.out.println(dto);
        };
    }

但文件包含第一行和最后一行,应将其删除。这些行以 \test 开头。 我的问题是:如何使用 Apache Camel API 删除这些行,而不检查每一行是否等于此值 \test? 我不想为每个文件行(伪代码)做这样的事情:

if (getFirstStringСharacter().equals("\test") {
    removeString();
}

也许 Apache Camel 在开始读取文件之前可以做一些初步的操作,并简单地忽略第一行和最后一行。

拆分的 EIP 在 每个 交易所上产生(除其他外)两个有趣的交易所属性:

  • CamelSplitIndex
  • CamelSplitComplete

假设行“//test”始终出现在第一行和最后一行,您的处理器(句柄)可以跳过处理

  • 当 CamelSplitIndex==0 [第一行]
  • 或者当 CamelSplitComplete 为真时[最后一行]

示例:跳过第一行

from("...")
    .split(body().tokenize("\n"))
    .streaming()
    .filter( simple("${exchangeProperty.CamelSplitIndex} > 0") ) 
    .process( handle() );

回答你的最后一个问题:

.filter( simple("${exchangeProperty.CamelSplitComplete} == false") )

在+/-复杂的情况下,我推荐使用Camel Predicate,例如:

import org.apache.camel.support.builder.PredicateBuilder;

Predicate isNotFirst = PredicateBuilder.isGreaterThan( exchangeProperty("CamelSplitIndex"), constant(0) );
Predicate isNotLast = PredicateBuilder.isNotEqualTo( exchangeProperty("CamelSplitComplete"), constant(true) );
Predicate retained = PredicateBuilder.and(isNotFirst, isNotLast);
    

from("...")
    .filter(retained)