gpt4 book ai didi

apache-camel - Apache Camel 2.17.3 - 使用 bindy 解码 CSV 流的异常

转载 作者:行者123 更新时间:2023-12-03 23:57:48 25 4
gpt4 key购买 nike

我编写了一个简单的方法来读取 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;
}
}

最佳答案

可能是您设置了 skipFirstLine = true 吗?但是由于您使用换行符拆分,因此跳过第一行意味着没有可以解析 CSV 的行。试试这个 .split().tokenize("\n", 1000).streaming() .这基本上意味着我们想要根据标记“\n”进行拆分,并且我们想要将 N 行组合在一起。在这种情况下,它是 1000,所以它最多将 1000 行组合在一起。

因此,如果您发送 10 000 行,它会将它们分成 10 个块。

现在的问题是,如果您设置了 skipFirstLine,它将跳过第一行。由于您之前拆分了每一行,因此当涉及到 CSV 解析器时,它会跳过该行,因为这是它被告知要做的。所以,没有什么可以解析的,它提示没有记录。

现在的问题是,在你每 1000 行拆分后会发生什么,你会得到 10 000 行。它会删除每个拆分块中的第一行吗?我会怀疑的。我认为最好的办法是在拆分之前添加一个处理器。将正文转换为字节 []。搜索第一个 "\n"并简单地删除该行或在该索引之后获取 byteArray。然后您可以进行正常拆分并删除skipFirstRow。

此外,您的输出在列表中,但这是由于您的映射。

关于apache-camel - Apache Camel 2.17.3 - 使用 bindy 解码 CSV 流的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39503312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com