如何从部分csv文件中填充类

时间:2012-12-11 13:13:16

标签: java csv import opencsv supercsv

我有Java课程:

class data {
  private String id;
  private String name;
  private String phone;
}

我需要填写CSV文件中的数据。但并非CSV文件中的所有列都是必需的,或者可能的顺序不同。

CSV示例1:

  

id,电话,姓名
  1,421904123456,彼得
  2,420558811225,约翰
  ...

CSV示例2:

  

id,姓名
  3,亚历克斯
  8,Stefan

有任何建议如何做到这一点?

3 个答案:

答案 0 :(得分:1)

使用OpenCSV来读取文件。当读取第一行存储列的顺序时。当阅读以下行(每行给出一个String[])时,使用第一行中的信息从数组中获取元素。

这是OpenCSV文档中的一个示例:

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
    // nextLine[] is an array of values from the line
    System.out.println(nextLine[0] + nextLine[1] + "etc...");
}

答案 1 :(得分:1)

  1. 阅读第一行以获取标题信息。
  2. 基于标题信息填充Method []数组,其中包含读取的字段集。
  3. 对于每个后续行,创建Data类的对象obj和行中的每个值,并在传递新创建的对象和rad值作为参数的数组的所有元素上调用invoke()。
  4. 您可以查看Execute SQL on CSV files via JDBC以使用jdbc查询CSV。

    此外,您的课程应该是Data而不是data

答案 2 :(得分:0)

Super CSV是另一个用于Java的开源CSV API,支持开箱即用的此功能。请参阅partial reading上的示例。

它使用标题(即第一行)来确定要映射到bean的字段 - 这样就可以很好地读取两个文件。

如果您在bean中使用其他类型(日期,整数等)而不仅仅使用字符串,那么Super CSV可以使用cell processor API为您完成所有必需的转换/转换。

例如,以下代码会读取您的两个文件,但只会填充CSV文件中存在的字段。

ICsvBeanReader beanReader = null;
try {
        beanReader = new CsvBeanReader(new FileReader(CSV_FILENAME), 
                CsvPreference.STANDARD_PREFERENCE);

        // header is used to map CSV column -> field in bean
        final String[] header = beanReader.getHeader(true); 

        Data data;
        while( (data = beanReader.read(Data.class, header)) != null ) {
                System.out.println(String.format("id=%s, name=%s, phone=%s",
                        data.getId(), data.getName(), data.getPhone()));
        }

}
finally {
        if( beanReader != null ) {
                beanReader.close();
        }
}