首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java11 openCSV只写入文件特定的bean属性

Java11 openCSV只写入文件特定的bean属性
EN

Stack Overflow用户
提问于 2021-10-04 23:33:40
回答 1查看 410关注 0票数 0

如何只向csv文件(使用openCSV)写入特定的bean属性

即给学生上课

代码语言:javascript
复制
public class MyEntry {

private String propOne;
private Long propTwo;
private int propThree;
private String propFour;
private String propFive;
...
private String propFifteen;

//getters and setter omitted for brevity

}

在其他情况下,我可能需要创建一个包含从propFourpropTen字段的csv文件,可能需要创建一个具有所有bean属性的csv。可能有许多情况需要将不同的字段导出到csv文件。如何在不为不同情况创建自定义类的情况下实现它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-05 03:38:03

您可以创建CSVWriter.java并使用反射概念读取类的属性。记住调用setAccesible(true),以便从外部访问私有字段

虚拟对象

代码语言:javascript
复制
import java.util.List;

public class Dummy {
  public static final List<String> GROUP_1 = List.of("prop1", "prop2");
  public static final List<String> GROUP_2 = List.of("prop1", "prop3");
  private String prop1;
  private Integer prop2;
  private String prop3;

  public String getProp1() {
      return prop1;
  }

  public Integer getProp2() {
      return prop2;
  }

  public String getProp3() {
    return prop3;
  }

  public void setProp1(String prop1) {
      this.prop1 = prop1;
  }

  public void setProp2(Integer prop2) {
      this.prop2 = prop2;
  }

  public void setProp3(String prop3) {
      this.prop3 = prop3;
  }
}

CSV编写器

代码语言:javascript
复制
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;

public class CSVWriter<T> {
    private List<T> dataList;

    CSVWriter(List<T> dataList){
        this.dataList = dataList;
    }

    public void setDataList(List<T> dataList) {
        this.dataList = dataList;
    }

    public List<T> getDataList() {
        return dataList;
    }

    void save(FileWriter fileWriter) {
        if(dataList == null) {
            throw new RuntimeException("the data was not initialized");
        }

        //TODO Write all attributes into csv file
    }

    void save(FileWriter fileWriter, List<String> attributeNames) throws NoSuchFieldException, IllegalAccessException, IOException {
        if(dataList == null) {
            throw new RuntimeException("the data was not initialized");
        }

        //TODO improve errors handle

        for (T data : dataList) {
            Class<?> c = data.getClass();
            for (String attribute : attributeNames) {
                Field field = c.getDeclaredField(attribute);
                String valueString = getValue(field, data);
                fileWriter.write(valueString + ",");
            }
            fileWriter.write("\n");
            fileWriter.flush();
        }

        fileWriter.close();
    }

    private String getValue(Field field, T data) throws IllegalAccessException {
        field.setAccessible(true); //due to private field
        return field.get(data).toString();
    }
}

如何使用它?

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    List<Dummy> dummyList = new ArrayList<>();
    Dummy dummy1 = new Dummy();
    dummy1.setProp1("prop 1 value");
    dummy1.setProp2(2);
    dummy1.setProp3("prop 3 value");


    dummyList.add(dummy1);

    CSVWriter<Dummy> csvWriter = new CSVWriter<>(dummyList);

    csvWriter.save(new FileWriter("group1.csv"), Dummy.GROUP_1);
    csvWriter.save(new FileWriter("group2.csv"), Dummy.GROUP_2);
    System.out.println("Hello World!");
}

我知道你需要使用OpenCSV来做这件事。我以前从未使用过这个库,但是这个概念应该是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69443392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档