使用Java流将标题和行的csv文件转换为hashmap数组

时间:2018-10-24 15:17:45

标签: java csv java-8 stream java-stream

我如何使用Java流将头文件和行的csv文件转换为hashmap数组? 例如。

orderNo, totals, charges, taxes, payments
ord121,1500.00,30.00,25.00,Paid
ord8925,1700.00,130.00,75.00,Paid
ord7115,300.00,130.00,75.00,Paid

Hashmap的数组[0]的名称应为orderNo,值应为ord121
Hashmap的Array [1]的名称应为orderNo,值应为ord8925 ...等

尝试过此操作,但坚持如何使行(0)内容作为哈希图名称

公共静态无效readFileToMap(){

    Pattern pattern = Pattern.compile(",");
    String csvFile = inputDirPreFix + "input/file2.tsv";
    try (BufferedReader in = new BufferedReader(new FileReader(csvFile));){

        Map<String,String> namefreq = in
                .lines()
                .skip(1)
                .map(lineData -> pattern.split(lineData))
                .collect(HashMap::new, (map, lineData) ->
                                map.put(lineData[0], lineData[1]),
                        Map::putAll);
        namefreq.forEach((k, v) -> System.out.println(k + " => " + v));
    }
    catch (Exception ex) {
        Logger.getLogger("FileProcessing").log(Level.SEVERE, null, ex);
    }
}

2 个答案:

答案 0 :(得分:1)

我认为您应该将每一行转换为Map<String, String>,然后将所有地图收集到List<Map<String, String>>

try (BufferedReader in = new BufferedReader(new FileReader(csvFile))) {

    List<Map<String,String>> namefreq = in.lines()
        .skip(1)
        .map(line -> pattern.split(line)) // or pattern::split
        .map(line -> {
            Map<String, String> map = new HashMap<>();
            map.put("NAME_OF_FIRST_COLUMN", line[0]);
            map.put("NAME_OF_SECOND_COLUMN", line[1]);
            // ... (etc)
            return map;
         })
        .collect(Collectors.toList());
}

编辑:最好不要创建自己的类,即Order,并使用orderNototals等属性,以及获取方法,而不是收集到地图列表setter和一个构造函数来接收整行,或者可能接收每个属性。然后,您可以收集到List<Order>

答案 1 :(得分:0)

暂时没有流管理...

[Tag1, Tag1, Tag1, Tag5, Tag5, Tag6, Tag6]