【问题标题】:How to read a CSV file, filter by a particular record and store it in different java object based on the records如何读取 CSV 文件,按特定记录过滤并根据记录将其存储在不同的 java 对象中
【发布时间】:2021-10-25 16:53:01
【问题描述】:

我有一个如下所示的 CSV 文件

Rahul|S|74|72|71
Randy|T|20000|2
Abinav|T|30000|3
Amrit|S|82|81|80

上述 csv 包含有关学校学生和教师的信息。 在第二列的帮助下,我们将能够识别信息是与学生还是教师有关

|S| - Student
|T| - Teacher

现在我想根据第二条记录过滤 CSV 文件,并将学生相关信息存储在 Student 类中,将教师相关信息存储在 Teacher 类中

我尝试过使用如下的 opencsv 来做同样的事情

public class Student {
  @CsvBindByPosition(position = 0)
  private String name;

  @CsvBindByPosition(position = 1)
  private String mathsScore;

  @CsvBindByPosition(position = 2)
  private String scienceScore;

  @CsvBindByPosition(position = 3)
  private String englishScore;
}

public class Teacher {
  @CsvBindByPosition(position = 0)
  private String name;

  @CsvBindByPosition(position = 1)
  private String salary;

  @CsvBindByPosition(position = 2)
  private String yearOfExp;
}

我的解析代码如下所示

List<Student> studentsList = new CSVToBeanBuilder(new FileReader(csvFile))
      .withType(Student.class)
      .build().parse();

如果 csv 只有一种类型的记录(学生或教师),这可以正常工作。 是否可以根据记录类型过滤csv并相应地解析为不同的java对象。

我知道如果我们循环遍历 csv 并逐行读取,我们可以实现它,但我不想这样做,因为我们的 csv 文件太大,这样做会影响性能。

【问题讨论】:

  • 您的问题很容易定义:这不是 csv 文件。这是一个包含带有分隔符的混合记录的文本文件

标签: java csv opencsv csv-parser


【解决方案1】:

如我所见,您需要这样编写代码:

List<Student> parse = new CsvToBeanBuilder<Student>(new FileReader("C:\\test\\test.csv"))
                .withType(Student.class)
                .withSeparator('|')
                .withFilter(line -> line[1].equals("S"))
                .build().parse();

我没有看到在一个构建器中设置不同类型映射的方法。

还要注意'@CsvBindByPosition(position = 1)' 会导致第二列。 Student.class 总是“S”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多