這是定義如何映射String[]
那就是你的JavaBean
的屬性一排CSV的。
假設您有一個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;
}
}
的關鍵點需要注意這個類有:
- 使用公共noargs構造;這在Java中是默認的,所以不需要指定構造函數。
- 所有屬性是私人的。
- 所有屬性都有getter,即返回值爲
getXxxx
的方法。
- 所有屬性都有setter,即設置其值的方法
setXxxx
。
現在;第一種方法setType
採用你的bean的類。它使用它通過reflection創建實例。在這種情況下,我們呼籲:
strat.setType(JavaBeanExample.class);
接下來,讓我們假設我們有一個CSV的格式如下
名稱,訂單號和訂單編號
李四,77777,00001
約翰·史密斯,77778,00002
因此,我們需要第一列第二映射到我們name
財產,我們orderNumber
親第三個到id
。我們使用bean中的屬性名稱來告訴OpenCSV要使用哪個設置器。 OpenCSV然後使用PropertyDescriptor
通過相應命名的setter來設置屬性。
在這種情況下,我們會打電話
String[] columns = new String[] {"name", "orderNumber", "id"};
strat.setColumnMapping(columns);
這是現在所有設置,我們可以踢OpenCSV通過調用
List list = csv.parse(strat, yourReader);
這將返回的JavaBeanExample
List
,每行一個在你的文件。
但是,這有點不愉快,因爲我們必須投下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
它的通用類型。這意味着當我們調用解析函數返回List<JavaBeanExample>
時,即知道其通用類型的List
。現在我們不必在List
中投射單個元素。
非常感謝您的回答!我現在總算明白了:-),它的功能就像一個魅力,再次感謝 – j0hny
上面的實現不會跳空行 –
@山陽區爲什麼會這樣呢?它們不應該存在於CSV文件中。 CSV是一種簡單,扁平的表格數據格式。 CSV文件中的空白行不應該超過一組SQL查詢結果中的空行。 –