[英]How to read several csv files into a HashMap?
我有 3 種不同類型的 csv 文件,每個文件都有不同的標題。 我目前使用MultiresourceItemReader
並將讀取委托給FlatfileItemReader
如下
@Bean
@StepScope
public MultiResourceItemReader<Model> multiResourceItemReader() {
MultiResourceItemReader<FileRow> resourceItemReader = new MultiResourceItemReader<FileRow>();
resourceItemReader.setResources( getInputResources() );
resourceItemReader.setDelegate( reader() );
return resourceItemReader;
}
@Bean
@StepScope
public FlatFileItemReader reader() {
log.debug("Header : {}", extraInfoHolder.getHeader());
return new FlatFileItemReaderBuilder<Model>()
.skippedLinesCallback(line -> {
String rsrc = multiResourceItemReader().getCurrentResource().toString();
log.debug("Current Resource : {}", rsrc);
// Verify file header is what we expect
if (!StringUtils.equals( line, extraInfoHolder.getHeader() )) {
throw new IllegalArgumentException( String.format("Invalid Header in " + rsrc) );
}
})
.name( "myReader" )
.linesToSkip( HEADER_ROW )
.lineMapper( new DefaultLineMapper() {
{
setLineTokenizer( getDelimitedLineTokenizer() );
setFieldSetMapper( getBeanWrapperFieldSetMapper() );
}} )
.build();
}
但是,我想將 csv 文件讀入 HashMap 而不是 Model POJO,即如果文件格式如下First Name, Last Name, Age
Doug, Jones, 57
Sam, Reed, 39
我想將每一行讀入一個映射,其中鍵是標頭標記,值是文件值,
地圖一:
First Name -> Doug
Last Name -> Jones
Age -> 57
地圖2:
First Name -> Sam
Last Name -> Reed
Age -> 39
在經典的 Spring Batch 方式中,我想讀取一行,將其轉換為映射,處理 + 寫入,然后讀取下一行。 我怎樣才能做到這一點?
這將返回您想要的地圖,
private static List<Map<String, Object>> getMapsFrom(String file) throws IOException {
List<Map<String, Object>> maps = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(file))))) {
int index = 0;
String line;
String[] keys = new String[3];
while ((line = br.readLine()) != null) {
if (index++ == 0){
keys = line.split(",");
}else{
String[] values = line.split(",");
for (int i = 0; i < values.length; i++) {
values[i] = values[i].trim();
}
Map<String, Object> map = new HashMap<>();
map.put(keys[0], values[0]);
map.put(keys[1], values[1]);
map.put(keys[2], Integer.parseInt(values[2]));
maps.add(map);
}
}
}
return maps;
}
假設您的 csv 文件始終采用以下形式
First Name, Last Name, Age
Doug, Jones, 57
Sam, Reed, 39
這是從上面的文件示例返回的地圖的屏幕截圖,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.