Apache camel + csv + header

时间:2014-03-31 10:49:39

标签: csv apache-camel flat-file

我有csv文件如下:

A;B;C
1;test;22
2;test2;33

其中第一行是一种标题,其他是数据。我有一个问题是导入与标题相关的所有数据行,并报告有多少行是正确的,有多少是不正确的。

我的第一个想法是以下列形式将源文件拆分为多个文件:

文件1:

A;B;C
1;test;22

file2的:

A;B;C
2;test2;33

如何在驼峰中执行此操作,如何收集打印摘要报告所需的数据?

3 个答案:

答案 0 :(得分:3)

看看Bean IO和Camel BeanIO组件。 看起来非常适合您的场景。 您可以在bean IO的第一页上构建示例代码

BeanIO http://beanio.org/

Camel BeanIO组件 http://camel.apache.org/beanio.html

如果您需要做的唯一事情是收集并计算成功和不成功的记录,则不需要拆分传入的文件。

答案 1 :(得分:0)

如果CSV不是太大而且适合内存,我会读取CSV文件并将其转换为Java对象列表。最新的Camel CSV组件可以在生成List<Map>的Camel 2.13之前将CSV文件转换为List<List>。在将已转换的CSV文件读入某个列表后,您可以编写自己的处理器来迭代列表并检查其内容。

答案 2 :(得分:0)

您可以将文件解组为CSV文件,删除第一行(标题),然后根据需要进行验证。按照驼峰路线实施的例子

from("file:mydir/filename?noop=true")
.unmarshal()
.csv()
.process(validateFile())
.to("log:my.package?multiline=true")

然后,您需要使用camel Processor定义validateFile()方法 像这样的课:

public Processor validateFile() {
    return new Processor() {
        @override
        public void process(Exchange exchange) throws Exception {
            List<List<String>> data = (List<List<String>>) exchange.getIn().getBody();
            String headerLine = data.remove(0);
            System.out.println("header: "+headerLine);
            System.out.println("total lines: "+data.size());

            // iterate over each line
            for( List<String> line : data) {
                System.out.println("Total columns: "+line.size());
                System.out.println(line.get(0)); // first column
            }
      }
    };
 }

在此方法中,您可以根据需要验证每个文件行/列,然后将其打印出来,甚至将此报告写入其他输出文件

使用Apache camel docs的文件和CSV组件页面作为参考;