我想从一个非结构化的CSV文件中读取。这意味着它每次都会有不同的列类型。请帮帮忙。
发布于 2019-03-05 17:12:08
是的,最终我自己找到了解决方案,我想和大家分享一下。您可以编写一个LineMapper,并且可以通过以下代码将非结构化标题(动态列)映射到每一行。请注意,我在作业调度时读取了报头,并将其作为JobParameter传递。
@Bean
@StepScope
public FlatFileItemReader<Customer> csvReader(@Value("#{jobParameters[filepath]}") String filepath,
@Value("#{jobParameters[header]}") String header,
@Value("#{jobParameters[campaignId]}") String campaignId,
@Value("#{jobParameters[_id]}") String _id) {
FlatFileItemReader<Customer> flatFileItemReader = new FlatFileItemReader<>();
flatFileItemReader.setResource(new FileSystemResource(filepath));
flatFileItemReader.setName("customer-csv-file-reader");
flatFileItemReader.setLinesToSkip(1);
flatFileItemReader.setLineMapper(lineMapper(header,campaignId,_id));
return flatFileItemReader;
}
@Bean
@StepScope
public LineMapper<Customer> lineMapper(@Value("#{jobParameters[header]}") String header,
@Value("#{jobParameters[campaignId]}") String campaignId,
@Value("#{jobParameters[_id]}") String _id) {
return new LineMapper<Customer>() {
public String[] headers = header.split(",");
@Override
public Customer mapLine(String line, int linenumber) throws Exception {
Customer item = new Customer();
String[] p = line.split(",");
Map<String, String> properties = IntStream.range(0, headers.length).boxed()
.collect(Collectors.toMap(i -> headers[i], i -> p[i]));
item.setCampaignId(new ObjectId(campaignId));
item.setInviteId(new ObjectId(_id));
item.setProperties(properties);
return item;
}
};
}https://stackoverflow.com/questions/54787181
复制相似问题