我有csv文件如下:
A;B;C
1;test;22
2;test2;33
其中第一行是一种标题,其他是数据。我有一个问题是导入与标题相关的所有数据行,并报告有多少行是正确的,有多少是不正确的。
我的第一个想法是以下列形式将源文件拆分为多个文件:
文件1:
A;B;C
1;test;22
file2的:
A;B;C
2;test2;33
如何在驼峰中执行此操作,如何收集打印摘要报告所需的数据?
答案 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组件页面作为参考;