当前位置: 首页 > 知识库问答 >
问题:

是否有一种方法可以自动检测字段/列顺序时加载CSV文件与头在第一行?

狄承望
2023-03-14
id,name,address,url
3,ruth,ruth address,ruth.com
B,sonia,sonia's street, thisissonia.eu
id,url,name
3,shutupmag.com,maggie
B,khaleesi.org,Mother of Dragons
@DataField(pos = 4, defaultValue = "") //for provider Stark
//@DataField(pos = 2, defaultValue = "") //for provider Lannister
//@DataField(pos = 3, defaultValue = "") //for provider Targaryen
public String url = "";

那么最后一个问题:我可以用Bindy(或者其他组件,我愿意接受建议,我只是更喜欢继续使用Bindy)自动检测Camel中的CSV字段名吗?

共有1个答案

何聪
2023-03-14

或者,您可以使用Camel CSV组件。您得到的不是完全初始化的值bean,而是一个包含映射的列表,其中包含键值对:

final CsvDataFormat format = new CsvDataFormat();
format.setUseMaps(true);
format.setDelimiter(",");

from("direct:start")
    .unmarshal(format)
    .process(new Processor() {
        @Override
        public void process(final Exchange exchange) throws Exception {
            final List<Map<String, String>> body = exchange.getIn().getBody(List.class);
            for (final Map<String, String> row : body) {
                LOG.info("new row: {}", row);
            }
        }
    });

与:

template.sendBody("direct:start", "id,name,address,url\n3,ruth,ruth address,ruth.com\nB,sonia,sonia's street, thisissonia.eu");
template.sendBody("direct:start", "id,url,name\n3,shutupmag.com,maggie\nB,khaleesi.org,Mother of Dragons"); 

您将得到以下输出:

new row: {id=3, address=ruth address, url=ruth.com, name=ruth}
new row: {id=B, address=sonia's street, url=thisissonia.eu, name=sonia}
new row: {id=3, url=shutupmag.com, name=maggie}
new row: {id=B, url=khaleesi.org, name=Mother of Dragons}   
 类似资料: