【问题标题】:camel Bindy @csvRecord generate Footer骆驼Bindy @csvRecord 生成页脚
【发布时间】:2023-03-10 00:37:01
【问题描述】:

我已经使用 @csvRecord 生成了带有 camel Bindy 的 CSV 文件,但无法为此 csv 生成页脚以显示文件中的记录总数。我可以使用@FixedLenght 记录生成,但不能使用@csvRecord。请提供任何建议

【问题讨论】:

    标签: java csv apache-camel footer bindy


    【解决方案1】:

    您不能在 CSV 中以与使用 camel-bindy 的 FixedLength 类似的方式生成页脚。

    根据数据,您可能会添加额外的记录,其中包含有关总数等信息。

    编辑:

    CSV 文件示例:

    FIELD1;FIELD2
    test1;4
    test3;6
    

    CsvFilePojo 类:

    import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
    import org.apache.camel.dataformat.bindy.annotation.DataField;
    
    @CsvRecord(separator = ";", skipFirstLine = true)
    public class CsvFilePojo {
    
        @DataField(pos = 1)
        private String field1;
    
        @DataField(pos = 2)
        private Integer field2;
    
        public CsvFilePojo(String field1, Integer field2) {
            this.field1 = field1;
            this.field2 = field2;
        }
    
        public CsvFilePojo() {
        }
    
        public String getField1() {
            return field1;
        }
    
        public void setField1(String field1) {
            this.field1 = field1;
        }
    
        public Integer getField2() {
            return field2;
        }
    
        public void setField2(Integer field2) {
            this.field2 = field2;
        }
    
        @Override
        public String toString() {
            return String.format("field1: %s; field2: %s", field1, field2);
        }
    
    }
    

    CountTotalProcessor 类:

    import java.util.List;
    
    import org.apache.camel.Exchange;
    import org.apache.camel.Processor;
    
    public class CountTotalProcessor implements Processor {
        @Override
        public void process(Exchange exchange) throws Exception {
            List<CsvFilePojo> csvlist = exchange.getIn().getBody(List.class);
    
            // count total
            Integer total = 0;
            for (CsvFilePojo c : csvlist) {
                total += c.getField2();
            }
    
            // add total as last record in csv data
            csvlist.add(new CsvFilePojo("total", total));
            exchange.getIn().setBody(csvlist);
        }
    }
    

    MyRouteBuilder 类:

    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat;
    
    public class MyRouteBuilder extends RouteBuilder {
    
        public void configure() {
            //@formatter:off
            from("file:csvFiles")
                .log("gotFile ${file:name}")
                .to("direct:processFile")
                .to("file:processedCsvFiles");
    
            from("direct:processFile")
                .log("processing CSV file")
                .unmarshal(new BindyCsvDataFormat(CsvFilePojo.class))
                .process(new CountTotalProcessor())
                .split(simple("${body}"))
                    .log("Body ${body}")
                .end()
                ;
        }
    
    }
    

    使用该示例 csv 文件,此路由将生成如下所示的 CSV 文件:

    FIELD1;FIELD2
    test1;4
    test3;6
    total;10
    

    【讨论】:

    • 您好 StefanR,感谢您的回复。您能否提供一个使用 Apache Camel 和 Bindy 组件来处理此要求的示例。
    • 我为你添加了一个简单的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2022-01-11
    相关资源
    最近更新 更多