首页 > 解决方案 > 将逗号分隔的文本文件读入 HashMap,其中文件在多行 Java 中具有相同的键

问题描述

我试图从逗号分隔的文件中读取日期作为键,并将 MeterID(这是文件中的第一项)作为值。但我的问题是,该文件在多行中具有相同的日期,当我尝试将文件读入哈希图中时,每个键都会获得额外的空值。

文件中的数据如下

MeterID,ServiceLocationID,ESIID,ReadingDate,ReadingTime,kWh,rxKWh,KVARHImprt,KVARhExprt,kWhImprtRateA,kWhImprtRateB,kWhExprtRateA,kWhExprtRateB,kVARhImprtRateA,kVARhImprtRateB,kVARhExprtRateA,kVARhExprtRateB,kVARhTotalRateA,kVARhTotalRateB,ExprtkVARhTotalRateA,ExprtkVARhTotalRateB
 1182798,,,13/04/2018,12:00:00AM,12391.000,0.000,,,6196.991,6194.366,0.074,0.000,1119.000,1132.000,0.000,0.000,,,,
 1182799,,,14/04/2018,12:00:00AM,690.000,0.000,,,348.468,342.449,0.074,0.000,95.000,96.000,0.000,0.000,,,,
 1182800,,,15/04/2018,12:00:00AM,2863.000,0.000,,,1133.865,1729.365,0.074,0.000,37.000,21.000,156.000,135.000,,,,
 1182801,,,16/04/2018,12:00:00AM,1578.000,0.000,,,1065.586,512.603,0.074,0.000,225.000,199.000,27.000,14.000,,,, 1182802,,,17/04/2018,12:00:00AM,2059.000,0.000,,,716.310,1343.338,0.074,0.000,58.000,85.000,63.000,78.000,,,,
 1182803,,,18/04/2018,12:00:00AM,1824.000,0.000,,,755.363,1069.038,0.074,0.000,234.000,289.000,65.000,73.000,,,, 1182804,,,18/04/2018,12:00:00AM,1824.000,0.000,,,755.363,1069.038,0.074,0.000,234.000,289.000,65.000,73.000,,,,

请参阅下面的代码以将文件中的数据读取到哈希图中

String filePath = "electric-enhanced_0000_201804130555.txt";
    String delimiter = ",";
    HashMap<String, String> map = new HashMap<>();

    try (Stream<String> lines = Files.lines(Paths.get(filePath)).skip(1)) {
        lines.filter(line -> line.contains(delimiter)).forEach(line -> map.put(line.split(delimiter)[3],
                line.split(delimiter)[0] + "," + map.get(line.split(delimiter)[3])));
    }

    System.out.println(map);

例外结果是

{15/04/2018=1182800、14/04/2018=1182799、17/04/2018=1182802、18/04/2018=1182804、1182803、16/04/2018=1182801、13/04/2018=118278 }

实际结果是- 我想排除的每个键都带有 null

{15/04/2018=1182800,null, 14/04/2018=1182799,null, 17/04/2018=1182802,null, 18/04/2018=1182804,1182803,null, 16/04/2018=1182801 ,null, 13/04/2018=1182798,null}

标签: java

解决方案


应该足够写:

lines.stream().filter(line -> line.contains(delimiter)).forEach(line -> map.put(line.split(delimiter)[3],
                    line.split(delimiter)[0]));

您可能还想HashMap用例如替换您的,org.apache.commons.collections.map.MultiValueMap这样您就可以在同一个键下存储多个值。

所以:

Map<String, String> map = new MultiValueMap();

我在您的测试数据中添加了一行,现在日期 18/04/2018 出现了两次,输出为 {15/04/2018=[1182800], 14/04/2018=[1182799], 18/04/2018= [1182803、1182804]、16/04/2018=[1182801]、13/04/2018=[1182798]}


推荐阅读