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)
在我的算法中,我逐行读取一个大文件(只是一种简单的 .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)