0

我有 Java 课程:

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

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

CSV 示例 1:

身份证,电话,姓名
1,421904123456,彼得
2,420558811225,约翰
...

CSV 示例 2:

id,姓名
3,Alex
8,Stefan

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

4

3 回答 3

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...");
}
于 2012-12-11T13:21:29.393 回答
1
  1. 阅读第一行以获取标题信息。
  2. 根据标头信息填充一个 Method[] 数组,其中包含读取的字段设置器。
  3. 对于随后的每一行,创建 Data 类的对象 obj 和行中的每个值,并在数组的所有元素上调用 invoke(),将新创建的对象和 rad 值作为参数传递。

也许您还可以查看通过 JDBC 对 CSV 文件执行 SQL以使用 jdbc 查询 CSV。

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

于 2012-12-11T13:25:00.620 回答
0

Super CSV是另一个用于 Java 的开源 CSV API,开箱即用地支持此功能。请参阅部分阅读示例。

它使用标题(即第一行)来确定要映射到 bean 的字段 - 因此将能够很好地读取您的两个文件。

如果您在 bean 中使用其他类型(日期、整数等)而不仅仅是字符串,那么 Super CSV 可以使用它的单元处理器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();
        }
}
于 2012-12-12T21:26:47.060 回答