【问题标题】:Failed to group the data by row in CSV file with Java无法使用 Java 在 CSV 文件中按行对数据进行分组
【发布时间】:2022-01-10 10:17:48
【问题描述】:

任何线索为什么在第 [1] 行出现错误(找不到符号行)?我想根据 CSV 文件中的第 1 行对数据进行分组,但我没有这样做。

private final static String COMMA_DELIMITER = ",";
     public List<List<String>> readCSVFile() throws IOException{
          List<List<String>> result = Files.readAllLines(Paths.get("D:\\APLC\\time_series_covid19_confirmed_global.csv"))
                                         .stream()
                                         .skip(1)
                                         .map(line -> Arrays.asList(line.split(COMMA_DELIMITER)))
                                         .collect(Collectors.groupingBy(line[1]).toList()); 
          return result; 
     }
}

样本输出: 从: |国家| 20/06/2021| 21/06/2021 | |:---- |:-----:| -----:| |马来西亚| 1 | 2 | |马来西亚| 1 | 2 | |马来西亚| 1 | 2 |

到: |国家| 20/06/2021| 21/06/2021 | |:---- |:-----:| -----:| |马来西亚| 3 | 6 |

【问题讨论】:

  • 您的意思是按第 1 列分组吗?您能分享示例输入和预期输出吗?
  • 例如,有多个列具有相同的值(例如:马来西亚),但它们位于名为“Country”的一行之下。因此,我想将所有数据合并到一个名为“马来西亚”的列中。
  • 知道了。我认为您正在交换行和列。 CSV 的每一行都是一行,一行中的每个命令分隔值是一列。我假设您想按列 Country 对数据进行分组,而这恰好是第一列。再次请求您编辑问题以共享示例输入和输出。
  • 我强烈建议您改用 CSV 解析器。如果任何字段值包含分隔符,您的代码将中断。
  • 你得到什么错误?编译时错误,还是运行时错误?请粘贴您收到的错误信息。

标签: java functional-programming


【解决方案1】:

有几点:

  1. 在分组时,您错误地引用了line[1]line 变量不能在那里访问。
  2. Collectors.groupingBy(Function, Collector) 接受一个函数和收集器
  3. 分组完成后,结果将是Map,分组值作为Map 中的键(在本例中为字符串)。因此,结果类型必须从 List&lt;List&lt;String&gt;&gt; 更改为 Map&lt;String, List&lt;List&lt;String&gt;&gt;&gt;

下面是运行示例代码:

package org.openapex.samples.misc.parse.csv;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ReadAndGroup70224600 {
    private final static String COMMA_DELIMITER = ",";
    public static void main(String[] args) throws IOException{
        readCSVFile("/resource/population.csv");
    }

    public static Map<String, List<List<String>>> readCSVFile(String file) throws IOException {
        Map<String, List<List<String>>> result = Files.readAllLines(Paths.get(file))
                .stream()
                .skip(1)
                .map(line -> Arrays.asList(line.split(COMMA_DELIMITER)))
                .collect(Collectors.groupingBy(value -> value.get(0), Collectors.toList()));
        System.out.println(result);
        return result;
    }
}

使用以下输入:

country,city,population
USA,San Francisco,20000
USA,NewYork City,60000
Australia,Sydney,25000
Australia,Melbourne,22000
USA,Boston,40000
England,London,70000

它产生以下输出:

{USA=[[USA, San Francisco, 20000], [USA, NewYork City, 60000], [USA, Boston, 40000]], England=[[England, London, 70000]], Australia=[[Australia, Sydney, 25000], [Australia, Melbourne, 22000]]}

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多