Apache camel ApacheCamel 2.17.3-使用bindy解组CSV流时出现异常

Apache camel ApacheCamel 2.17.3-使用bindy解组CSV流时出现异常,apache-camel,integration,Apache Camel,Integration,我编写了一个简单的路径来读取CSV文件,并将其保存为JSON格式的新文件 当我尝试拆分和流式处理正文时,解组将以“.IllegalArgumentException:CSV中未定义任何记录”中断 但是,它在没有拆分和流式处理的情况下运行良好 解组使用BindyCsvDataFormat和CustomCsvRecord定义字段 CSV Sample: HEADER_1;HEADER_2;HEADER_3;HEADER_4;HEADER_5 data11;data12;data13;data14;d

我编写了一个简单的路径来读取CSV文件,并将其保存为JSON格式的新文件

当我尝试拆分和流式处理正文时,解组将以“.IllegalArgumentException:CSV中未定义任何记录”中断

但是,它在没有拆分和流式处理的情况下运行良好

解组使用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条线组合在一起

因此,如果您发送10000行,它将把它们分成10个块

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

现在的问题是,如果按每1000行进行拆分,得到10000行,会发生什么。它会删除每个分割块中的第一行吗?我怀疑是这样。我认为最好的办法是在拆分之前添加一个处理器。将正文转换为字节[]。搜索第一个“\n”,只需删除该行或获取该索引后的byteArray即可。然后,您可以执行普通拆分并删除skipFirstRow


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

并且您确定您的分隔符是\n而不是CRLF\r\n?是的,上面的示例正文使用“\n”分割,但是,即使使用“\r\n”也会产生相同的结果。我可以在不进行解组的情况下对其进行流式处理,并且可以使用“\n”进行节流。如果您发送一个示例CSV,比如5行,并在拆分和流式处理后记录正文,正文看起来如何?[mel-1)线程#0-file://data]路由1信息头_1;标题2;标题3;标题4;收割台5[mel-1)螺纹#0-file://data]DefaultErrorHandler错误传递失败(ExchangeId:ID-Admin-PC-60394-1473926738496-0-3上的MessageId:ID-Admin-PC-60394-1473926738496-0-4)。交付尝试后耗尽:1捕获:java.lang.IllegalArgumentException:csv中未定义任何记录有趣的是,我确实看到了csv记录;它读取每一行,在尝试解组时失败。