使用java处理多个csv行

问题描述 投票:0回答:2

我有一个文件,我在一个新的行中写了一个csv值。结果看起来像那样:

Hello;kind;world
Mister;John;Doe

等等。我也有一个带有构造函数的类,它取每个部分值,例如: John作为参数:

public MyClass(String first, String second, String third) {}

结果我需要一个Collection<MyClass>。处理I迭代每个csv行,然后在特定行值的内部for循环后,用;分割它:

Collection<String> csvLines = Files.readAllLines(pathToMyFile);
for (String csvLine : csvLines) {
 String[] csvLineSplitted = csvLine.split(";");
 for (int i = 0; i < csvLineSplitted.length; i++) {
  String value = scvLineSPlitted[i]; //This can be the above mentioned value, e.g. 'John'
 }
}

如何使用每个特定参数创建MyClass类型的对象,然后将其存储在Collection<MyCLass> result中?

java csv for-loop collections
2个回答
1
投票

您也可以使用Streams实现此目的:

private class MyClass {
    private String first;
    private String second;

    MyClass(String first, String second) {
        this.first = first;
        this.second = second;
    }

    @Override
    public String toString() {
        return "MyClass [first=" + first + ", second=" + second + "]";
    }

}


List<MyClass> list = Files.lines(path)
        .map(line -> line.split(";"))
        .map(splittedLine -> new MyClass(splittedLine[0], splittedLine[1]))
        .collect(Collectors.toList());

System.out.println(list);

如果您有两列以上的内容,只需修改第二个地图运算符即可满足您的要求


2
投票

只需定义一个类:

public class MyClass {
    private String param1;
    private String param2;

    public MyClass(String param1, String param2) {
        this.param1 = param1;
        this.param2 = param2;
    }

    // getters and setters
}

然后在迭代CSV数据时使用该类:

Collection<String> csvLines = Files.readAllLines(pathToMyFile);
List<MyClass> list = new ArrayList<>();
for (String csvLine : csvLines) {
    String[] csvLineSplitted = csvLine.split(";");
    MyClass node = new MyClass(csvLineSplitted[0], csvLineSplitted[1]);
    list.add(node);
}

请注意,我假设您的数据只有两列。如果实际数据有多个列,那么在for循环中迭代的方法更有意义。

© www.soinside.com 2019 - 2024. All rights reserved.