【问题标题】:How to stream a csv file with header to a HashMap<String, Double> in Java?如何将带有标题的 csv 文件流式传输到 Java 中的 HashMap<String, Double>?
【发布时间】:2018-12-13 19:35:12
【问题描述】:

我有一个示例 csv 文件如下(一个虚拟 csv 文件结构供参考):

Col0, Col1, Col2, Col3, Col4, Col5
str1, str2, str3, str4, str5, 45.545
str1, str2, str3, str4, str5, 45.545
str1, str2, str3, str4, str5, 45.545
str1, str2, str3, str4, str5, 45.545
str1, str2, str3, str4, str5, 45.545

我正在尝试将此 csv 文件读入 HashMap&lt;String, Double&gt;,其中密钥生成为 (Col1 + "|" + Col2 + "|" + Col3 + "|" + Col4 + "|" + Col0) and value as Col5

我在这里关注了一篇类似的文章 (How to convert csv to a map using Java 8 Stream),但在将 Col5 转换为 double 时出错,如下所示:

java.lang.NumberFormatException: 空字符串

以下是我目前使用的代码:

    private void convertCsvtoMap(final String filePath) {
        try {
            Stream<String> lines = Files.lines(Paths.get(filePath));
            Map<String, Double> resMap = lines.skip(1).map(line -> line.split(",")).collect(
                    Collectors.toMap(line -> (line[1] +  "|" + line[2] +  "|" + line[3] + "|" + line[4] + "|" + line[0]), line -> Double.parseDouble(line[5])));


        } catch (IOException e) {
            e.getLocalizedMessage();
        }
    }

【问题讨论】:

  • 使用 this 示例文件我得到一个 different 错误。发布更接近于展示您的问题的示例 CSV。
  • 无法判断,因为您的示例文件没有重现问题。找出哪一行给出了异常,您可能会发现问题所在。

标签: java


【解决方案1】:

我不会给你完整的解决方案,但这里有一个解决这个问题的方法,

步骤:

  • 读取文件(我正在使用扫描仪)。
  • 使用, 分隔符分割行。
  • 使用拆分后的值创建 keyvalue
  • 将其添加到您的地图中。

代码片段:

private void convertCsvtoMap(final String filePath) {
    try (Scanner in = new Scanner(new File(filePath))) {
        String line = null;
        Map<String, Double> resMap = new HashMap<>();
        while (in.hasNextLine()) {
            line = in.readLine();
            String[] fields = line.split(",");
            String key = fields[0].trim() + "|" + fields[1].trim() + ...;
            double value = Double.parseDouble(fields[5].trim());
            resMap.put(key, value);
        }
    } catch (Exception ex) {
        /* Handle Exception */
    }
}

注意:我没有编译代码,它可能有一些语法问题。

【讨论】:

    【解决方案2】:
    public static Map<String, String> csvToMap(File csvFile) throws FileNotFoundException {
    
        final Scanner scanner = new Scanner(csvFile);
        String[] keys = scanner.nextLine().split(",");
    
        Map<String, String> resultMap = new HashMap<>();
    
        while (scanner.hasNextLine()) {
            String[] values = scanner.nextLine().split(",");
    
            for (int i = 0; i < keys.length; i++) {
                resultMap.put(keys[i], values[i]);
            }
        }
    
        return resultMap;
    }
    

    在上面的示例中,值也存储为字符串。如有必要,您可以将值解析为 Map 的值类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多