3

私は 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 FAQサイトと別の質問にあります。問題は、オブジェクト ColumnPositionMappingStrategy がどのように見えるべきか、また strat.setType ステートメント (YourOrder Bean.class) で何を渡すべきかの仕様を見つけることができないことです。setColumnMapping メソッドも私にはわかりませんが、残りを知っていれば、自分でそれを理解できると思います...

このコードのビットをもっと説明してくれる親切な人はいますか? Javaの基本的な知識が不足しているため、openCSVのドキュメントは非常に簡単です(PHPから来ており、大きな違いがあります)

前もって感謝します!

4

1 に答える 1

7

String[]これは、CSV の行である を のプロパティにマップする方法を定義しています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;
    }
}

このクラスに関する重要なポイントは次のとおりです。

  1. public noargs コンストラクターを使用します。これは Java のデフォルトであるため、コンストラクターを指定する必要はありません。
  2. すべてのプロパティはプライベートです。
  3. すべてのプロパティにはゲッター、つまりgetXxxx値を返すメソッドが呼び出されます。
  4. すべてのプロパティにはセッター、つまりsetXxxx値を設定するために呼び出されるメソッドがあります。

今; 最初のメソッド はsetType、Bean のクラスを取得します。これを使用して、リフレクションを介してインスタンスを作成します。この場合、次のように呼び出します。

strat.setType(JavaBeanExample.class);

次に、次の形式の CSV があるとします。

名前、注文番号、注文 ID
Joe Bloggs、77777、00001
John Smith、77778、00002

したがって、最初の列をnameプロパティに、2 番目をorderNumberプロパティに、3 番目をにマップする必要がありidます。Bean 内のプロパティ名を使用して、使用するセッターを OpenCSV に伝えます。次に、OpenCSV は a を使用しPropertyDescriptorて、対応する名前のセッターを介してプロパティを設定します。

この場合、次のように呼び出します。

String[] columns = new String[] {"name", "orderNumber", "id"};
strat.setColumnMapping(columns); 

これですべての設定が完了し、OpenCSV を呼び出して開始できます。

List list = csv.parse(strat, yourReader);

これにより、ファイルの各行に 1 つずつ、 Listofが返されます。JavaBeanExample

しかし、これはやや不愉快です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 を呼び出すと aList<JavaBeanExample>が返されることを意味します。つまり、Listそのジェネリック型を知っています。の個々の要素をキャストする必要がなくなりましたList

于 2013-06-23T10:59:18.213 に答える