2013-06-23 97 views
3

我剛剛開始使用Java,並且有很多遺漏的知識,但我需要編寫一個簡單的類,它將使用openCSV將csv文件轉換爲JavaBean。我在這裏找到了類似的排隊的一些答案,但沒有人能夠幫助我。到目前爲止,已經來到翻過這段代碼:通過openCSV填充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,它有很大的不同)

在此先感謝!

回答

5

這是定義如何映射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; 
    } 
} 

的關鍵點需要注意這個類有:

  1. 使用公共noargs構造;這在Java中是默認的,所以不需要指定構造函數。
  2. 所有屬性是私人的。
  3. 所有屬性都有getter,即返回值爲getXxxx的方法。
  4. 所有屬性都有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); 

這將返回的JavaBeanExampleList,每行一個在你的文件。

但是,這有點不愉快,因爲我們必須投下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中投射單個元素。

+0

非常感謝您的回答!我現在總算明白了:-),它的功能就像一個魅力,再次感謝 – j0hny

+0

上面的實現不會跳空行 –

+0

@山陽區爲什麼會這樣呢?它們不應該存在於CSV文件中。 CSV是一種簡單,扁平的表格數據格式。 CSV文件中的空白行不應該超過一組SQL查詢結果中的空行。 –