我编写了一条简单的路径来读取CSV文件并将其保存为JSON格式的新文件。
当我尝试拆分和流式传输主体时,解组时会出现“.IllegalArgumentException:CSV中没有定义任何记录”。
然而,如果没有拆分和流媒体,它的效果很好!
Unmarshal使用BindyCsvDataFormat,CustomCsvRecord定义字段。
CSV Sample:
HEADER_1;HEADER_2;HEADER_3;HEADER_4;HEADER_5
data11;data12;data13;data14;data15
data21;data22;data23;data24;data25
你能帮我理解这是正确的行为,如果是这样,我怎样才能控制阅读大文件?
请参阅以下内容:
public class MyRouteBuilder extends RouteBuilder {
public void configure() {
BindyCsvDataFormat bindy = new BindyCsvDataFormat(com.demo.camel.CustomCsvRecord.class);
from("file://data?move=../completed/&include=.*.csv&charset=UTF-8")
.log("Reading file..")
// .split(body().tokenize("\n")).streaming()
// .throttle(2)
// .timePeriodMillis(3000)
.unmarshal(bindy)
.marshal().json(true)
.log("writing to file")
.to("file://target/messages?fileExist=Append");
}
}
@CsvRecord(separator = ";", skipFirstLine = true )
public class CustomCsvRecord implements Serializable{
private static final long serialVersionUID = -1537445879742479656L;
@DataField(pos = 1)
private String header_1;
@DataField(pos = 2)
private String header_2;
@DataField(pos = 3)
private String header_3;
@DataField(pos = 4)
private String header_4;
@DataField(pos = 5)
private String header_5;
public String getHeader_1() {
return header_1;
}
public void setHeader_1(String header_1) {
this.header_1 = header_1;
}
public String getHeader_2() {
return header_2;
}
public void setHeader_2(String header_2) {
this.header_2 = header_2;
}
public String getHeader_3() {
return header_3;
}
public void setHeader_3(String header_3) {
this.header_3 = header_3;
}
public String getHeader_4() {
return header_4;
}
public void setHeader_4(String header_4) {
this.header_4 = header_4;
}
public String getHeader_5() {
return header_5;
}
public void setHeader_5(String header_5) {
this.header_5 = header_5;
}
}
答案 0 :(得分:2)
你是否设置了skipFirstLine = true?但是,由于您使用换行符进行拆分,跳过第一行意味着没有行来解析CSV。请改为.split().tokenize("\n", 1000).streaming()
。这基本上意味着我们希望基于令牌" \ n"我们想要将N行组合在一起。在这种情况下,它是1000,因此在分割中最多将1000组线组合在一起。
因此,如果您发送10 000行,它将以10个块分割它们。
现在问题是如果你有skipFirstLine设置它会跳过第一行。由于您以前拆分了每一行,因此当它涉及CSV解析器时,它将跳过该行,因为这是它被告知要执行的操作。所以,没有什么可以解析,它抱怨没有记录。
现在的问题是,在你拆分之后发生的情况说每1000行就会得到10 000行。它会删除每个拆分块中的第一行吗?我会怀疑的。我认为最好的办法是在拆分之前添加一个处理器。将正文转换为byte []。搜索第一个" \ n"并简单地删除该行或获取该索引后的byteArray。然后你可以做普通的拆分并删除skipFirstRow。
此外,您的输出在列表中,但这是由于您的映射。