我刚开始使用Java并且有很多缺少的知识,但我需要编写一个简单的类,它将使用openCSV将csv文件转换为JavaBean。我在这里找到了类似排队的一些答案,但没有人能够帮助我。到目前为止,已经有了一些代码:
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);
位于openCSV常见问题解答网站上,此处还有另一个问题。问题是我无法找到规范对象ColumnPositionMappingStrategy应该是什么样子以及应该在strat.setType语句(YourOrder Bean.class)中传递的内容。 setColumnMapping方法对我来说也是一样的,但我相信当我知道其余的时候,我可以自己想出那个......
有人会更友好地解释这段代码吗? openCSV文档对我来说非常简短,因为我缺乏一些基本的Java知识(来自PHP,它有很大的不同)
提前致谢!
答案 0 :(得分:7)
这是定义如何将作为CSV行的String[]
映射到JavaBean
的属性。
让我们假设您有class
这样:
public class JavaBeanExample {
private Integer id;
private String name;
private Integer orderNumber;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getOrderNumber() {
return orderNumber;
}
public void setOrderNumber(Integer orderNumber) {
this.orderNumber = orderNumber;
}
}
关于这门课程的关键要点是:
getXxxx
的返回其值的方法。setXxxx
的方法,用于设置其值。现在;第一个方法setType
获取bean的类。它使用它通过reflection创建实例。在这种情况下,我们会打电话:
strat.setType(JavaBeanExample.class);
接下来,我们假设我们有以下格式的CSV
名称,订单号,订单ID
Joe Bloggs,77777,00001
约翰史密斯,77778,00002
因此,我们需要将第一列映射到name
属性,第二列映射到orderNumber
属性,第三列映射到id
。我们使用bean中的属性名称告诉OpenCSV使用哪个setter。然后,OpenCSV使用PropertyDescriptor
通过相应命名的setter来设置属性。
在这种情况下,我们会打电话给
String[] columns = new String[] {"name", "orderNumber", "id"};
strat.setColumnMapping(columns);
现在这已经完成,我们可以通过调用
来启动OpenCSVList list = csv.parse(strat, yourReader);
这将返回List
JavaBeanExample
,文件中每行一个。{/ p>
但这有点不愉快,因为我们必须在List
中投射每一项。这是因为这个例子有点过时了。下面是一个使用generics的示例,这个例子是用Java 7编写的。
final ColumnPositionMappingStrategy<JavaBeanExample> strategy = new ColumnPositionMappingStrategy<>();
strategy.setType(JavaBeanExample.class);
strategy.setColumnMapping(new String[]{"name", "orderNumber", "id"});
final CsvToBean<JavaBeanExample> csvToBean = new CsvToBean<>();
final List<JavaBeanExample> beanExamples;
try (final Reader reader = new FileReader("myFile.csv")) {
beanExamples = csvToBean.parse(strategy, reader);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
这里的不同之处在于我们使用尖括号告诉ColumnPositionMappingStrategy
它的泛型类型。我们还告诉CsvToBean
它的泛型类型。这意味着当我们调用parse时会返回List<JavaBeanExample>
;即List
知道其通用类型。现在我们不必在List
中投射单个元素。