【问题标题】:how to fill class from partial csv file如何从部分 csv 文件中填充类
【发布时间】:2012-12-11 13:13:15
【问题描述】:

我有 Java 课程:

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

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

CSV 示例 1:

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

CSV 示例 2:

身份证,姓名
3、亚历克斯
8、斯特凡

有什么建议吗?

【问题讨论】:

  • 您是否已经有代码来填写“完整”案例的数据(您的示例 1)?
  • 获取文件内容,读取每一行,按,分割,修剪,存储标题列名称并读取剩余值,同时将一些if放在这里和那里;)
  • Super CSV 支持 partial reading 开箱即用 - 请参阅我的答案:)

标签: java csv import opencsv supercsv


【解决方案1】:
  1. 读取第一行以获取标题信息。
  2. 根据标头信息填充一个 Method[] 数组,其中包含读取的字段设置器。
  3. 为随后的每一行创建一个 Data 类的对象 obj 和行中的每个值,并在数组的所有元素上调用 invoke(),并将新创建的对象和 rad 值作为参数传递。

也许您也可以查看Execute SQL on CSV files via JDBC 以使用 jdbc 查询 CSV。

另外,你的班级应该是Data 而不是data

【讨论】:

    【解决方案2】:

    使用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...");
    }
    

    【讨论】:

      【解决方案3】:

      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();
              }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 2013-05-12
        • 2013-11-25
        • 2020-06-01
        • 1970-01-01
        • 2019-07-23
        • 1970-01-01
        相关资源
        最近更新 更多