java - 使用 Java 8 Stream 解析 .csv 文件

标签 java csv java-8 java-stream

我有一个 .csv 文件,其中包含 500 多家公司的数据。文件中的每一行都引用一个特定的公司数据集。我需要解析这个文件并从每个文件中推断数据以调用 4 个不同的 Web 服务。

.csv 文件的第一行包含列名称。我正在尝试编写一个采用字符串参数的方法,这与 .csv 文件中的列标题有关。

基于此参数,我希望该方法使用 Java 8 的 Stream 功能解析文件,并返回从每一行/公司的列标题中获取的数据列表。

我觉得我让事情变得比需要的更复杂,但想不出更有效的方法来实现我的目标。

任何想法或想法将不胜感激。

通过 stackoverflow 搜索,我发现了以下类似但不完全相同的帖子。 Parsing a CSV file for a unique row using the new Java 8 Streams API

    public static List<String> getData(String titleToSearchFor) throws IOException{
    Path path = Paths.get("arbitoryPath");
    int titleIndex;
    String retrievedData = null;
    List<String> listOfData = null;

    if(Files.exists(path)){ 
        try(Stream<String> lines = Files.lines(path)){
            List<String> columns = lines
                    .findFirst()
                    .map((line) -> Arrays.asList(line.split(",")))
                    .get();

            titleIndex = columns.indexOf(titleToSearchFor);

            List<List<String>> values = lines
                    .skip(1)
                    .map(line -> Arrays.asList(line.split(",")))
                    .filter(list -> list.get(titleIndex) != null)
                    .collect(Collectors.toList());

            String[] line = (String[]) values.stream().flatMap(l -> l.stream()).collect(Collectors.collectingAndThen(
                    Collectors.toList(), 
                    list -> list.toArray()));
            String value = line[titleIndex];
            if(value != null && value.trim().length() > 0){
                retrievedData = value;
            }
            listOfData.add(retrievedData);
        }
    }
    return listOfTitles;
}

谢谢

最佳答案

您不应该重新发明轮子并使用通用的 csv 解析器库。例如,您可以只使用 Apache Commons CSV .

它将为您处理很多事情并且更具可读性。还有OpenCSV ,它甚至更强大,并且带有基于注释的数据类映射。

 try (Reader reader = Files.newBufferedReader(Paths.get("file.csv"));
            CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
                    .withFirstRecordAsHeader()        
        ) {
            for (CSVRecord csvRecord : csvParser) {
                // Access
                String name = csvRecord.get("MyColumn");
                // (..)
          }

编辑: 不管怎样,如果你真的想自己做,看看this示例。

关于java - 使用 Java 8 Stream 解析 .csv 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49660669/

相关文章:

java - 有没有一种优雅的方法来打开包裹在 2 个嵌套的 Optionals 中的对象?

Java 8 lambda - 运行时错误

Java - 应用程序中使用的 HashMap 和 WeakHashMap 引用

python - 将多个 csv 文件读取到 HDF5 时,Pandas ParserError EOF 字符

c# - 解析高级 CSV 文件

JavaMail javax.mail.AuthenticationFailedException

java - Integer.MIN_VAL 仍然显示负值

python - 将 Header 和 Dataframe 放入新的 CSV 中

java - equals() 方法的工作原理

java - 如何使用 Jackson 区分 JSONArray 和 JSONObject 与 InputStream?