簡體   English   中英

如何將幾個csv文件讀入HashMap?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM