如何轻松处理CSV文件到List<MyClass>

2022-09-04 06:40:52

在我的应用程序中,我使用了很多CSV文件,我必须阅读这些文件并基于它们构建列表。我想找到一个简单的方法来做到这一点。您知道任何简单的框架在不使用配置文件等数量的情况下做到这一点吗?

例如,我有一个类人:

public class Person {
    String name;
    String surname;

    double shoeSize;
    boolean sex; // true: male, false:female

    public Person() {
    }

    public String getName() {
            return name;
    }

    public void setName(String name) {
            this.name = name;
    }

    public String getSurname() {
            return surname;
    }

    public void setSurname(String surname) {
            this.surname = surname;
    }

    public double getShoeSize() {
            return shoeSize;
    }

    public void setShoeSize(double shoeSize) {
            this.shoeSize = shoeSize;
    }

    public boolean isSe) {
            return sex;
    }

    public void setSeboolean sex) {
            this.sex = sex;
    }

}

对于这个类,我准备了CSV文件:

name,surname,shoesize,sex
Tom,Tommy,32,true
Anna,Anny,27,false

我怎样才能轻松做到?


答案 1

读取和序列化数据的最简单方法之一是使用 Jackson 库。它还具有CSV的扩展名,您可以在此处找到wiki

假设你有一个像这样的Pojo:

@JsonPropertyOrder({ "name", "surname", "shoesize", "gender" })
public class Person {

    public String name;
    public String surname;
    public int shoesize;
    public String gender;

}

以及如下所示的 CSV:

Tom,Tommy,32,m
Anna,Anny,27,f

然后阅读它是这样完成的:

MappingIterator<Person> personIter = new CsvMapper().readerWithTypedSchemaFor(Person.class).readValues(csvFile);
List<Person> people = personIter.readAll();

对于我的口味来说,这很简单,基本上您需要做的就是使用注释在CSV文件中添加列顺序,然后使用上面的2行读取文件。@JsonPropertyOrder


答案 2

有很多用Java编写的好框架来解析CSV文件并形成对象列表。OpenCSVJSefajCSV就是其中的一小部分。

对于您的要求,我相信jCSV最适合。下面是来自jCSV的示例代码,您可以轻松使用它。

Reader reader = new FileReader("persons.csv");

CSVReader<Person> csvPersonReader = ...;

// read all entries at once
List<Person> persons = csvPersonReader.readAll();

// read each entry individually
Iterator<Person> it = csvPersonReader.iterator();
while (it.hasNext()) {
  Person p = it.next();
  // ...
}

此外,解析CSV文件并将其转换为列表并不是什么大问题,可以在不使用任何框架的情况下实现,如下所示。

br = new BufferedReader(new FileReader(csvFileToRead));  
List<Person> personList = new ArrayList<>();
while ((line = br.readLine()) != null) {  
       // split on comma(',')  
       String[] personCsv = line.split(splitBy);  

       // create car object to store values  
       Person personObj = new Person();  

       // add values from csv to car object  
       personObj.setName(personCsv[0]);  
       personObj.setSurname(personCsv[1]);  
       personObj.setShoeSize(personCsv[2]);  
       personObj.setGender(personCsv[3]); 

       // adding car objects to a list  
       personList.add(personObj);         
} 

如果在实际情况下,CSV列到Bean对象的映射是复杂,重复或大的,那么可以使用DozerBeanMapper轻松完成。

希望这会帮助你。

希希尔


推荐