2016-06-30 5 views
-1

私はcsvファイルからリストを持っています。このcsvファイルは、このように移入さ:リスト<String[]>を一覧に変換するには<MyObject>?

_Name_ |_Surname_|_Sex_ 
_nam1_ | _sur1_ | _s1_ 
_nam2_ | _sur2_ | _s2_ 

だから私はない:タイプの

CSVReader reader = new CSVReader(new FileReader("file.csv")); 
List<String[]> myEntries = reader.readAll(); 

は、私は別のリストを作成したい、好きMyObjectに:

List<MyObject> list = new ArrayList<MyObject>(); 

クラスをMyObjectの内容は次のとおりです。

private String name; 
private String surname; 
private String sex; 

を取得して設定します。 そして、何が最初のリスト内のですが中に移動されなければならない:

list.setName(); 
list.setSurname(); 
list.setSex(); 

私はこれをどのように行うことができますか?

答えて

-1

手順1 - CSVReaderを正しく初期化してください。

CSVReader(Reader reader, char separator, char quotechar, int line)API documentationによると、あなたは適切なコンストラクタを使用して最初の行をスキップすることができ、また、あなたはそれがデータのフォーマットを知っているquotecharseparatorを指定する必要があります。

CSVReader reader = new CSVReader(new FileReader("file.csv"), ',', '_', 1); 

ステップ2 - java.util.stream

myEntries.forEach(entity -> { 
    MyObject object = new MyObject(); 

    object.setName(entity[0]); 
    object.setSurname(entity[1]); 
    object.setSex(entity[2]); 

    list.add(object); 
}); 

以上を使用して収集したオブジェクトは、このようにそれのために適切なコンストラクタを定義:

public MyObject(String name, String surname, String sex) { 
    setName(name); 
    setSurname(surname); 
    setSex(sex); 
} 

ループ簡素化:

myEntries.forEach(entity -> list.add(new MyObject(entity[0], entity[1], entity[2])); 

質問 - 1000個の列がある場合はどうなりますか?

arizzleと記載されているように、1つのクラスに1000個のフィールドを持つことはお勧めできません。MyObjectの代わりにHashMapを使用することをお勧めします。ここで

+0

配列リストに1000文字列が含まれている場合はどうなりますか? – Marco

+0

@Marcoあなたは1000列または1000行を意味しますか? – gevorg

+0

私は1000カラムを意味します。 名前、姓、年齢、性別、身長、体重、国、誕生日、.... – Marco

1

あなたが試すことができるものである。

List<MyObject> list = new ArrayList<MyObject>(); 

for(String[] entry : myEntries){ 
    MyObject obj = new MyObject(); 
    //assign values to properties of our object 
    obj.setName(entry[0]); 
    obj.setSurname(entry[1]); 
    obj.setSex(entry[2]); 

    //add object to list 
    list.add(obj); 
} 

私は

+0

メタ情報が入っているので、最初の行をスキップする必要があると思います。 – gevorg

1

MyObjectにする場合に役立ちます願っています。このクラスには、使用できるよりもあなたの3つの情報と連携コンストラクタを持っています

for (String[] item : myEntries) { 
     list.add(new MyObject(item[0], item[1], item[2]); 
    } 

それ以外の場合は、これを試してみてください。そして、

public final class MyObject { 

    private final String name, surname, sex; 

    public MyObject(final String name, final String surname, final String sex) { 
     this.name = name; 
     this.surname = surname; 
     this.sex = sex; 
    } 
} 

ます:

for (String[] item : myEntries) { 
     MyObject myObj = new MyObject(); 
     myObj.setName(item[0]); 
     myObj.setSurname(item[1]); 
     myObj.setSex(item[2]); 
     list.add(myObj); 
    } 
+0

配列リストに1000文字列が含まれている場合はどうなりますか? – Marco

+0

@Marco何を意味するのか分かりませんか? ArrayListにはMyObjectクラスのオブジェクトしか含めることができません。 – Blobonat

+0

は平均1000カラムです。 – Marco

0

MyObjectのようなコンストラクタを持っていると仮定すると、できる:

List<MyObject> myObjects = reader.readAll() 
           .stream() 
           .map(entry -> new MyObject(entry[0], entry[1], entry[2])) 
           .collect(Collectors.toList()); 
spliteratorを使っ

オルタナティブ:

List<MyObject> myObjects = StreamSupport.stream(csvReader::spliterator, ORDERED, true) 
           .map(entry -> new MyObject(entry[0], entry[1], entry[2])) 
           .collect(Collectors.toList()); 
+0

メタ情報が入っているので、最初の行をスキップする必要があると思います。 – gevorg

+0

@gevorg私はスキップする行の数を指定する 'CSVReader'を構築するオプションがあると信じています – explv

+0

はい、あなたは正しいです[CSVReader](http://opencsv.sourceforge.net/apidocs/com/opencsv/ CSVReader.html) 'line'パラメータはそのためのものです。 – gevorg

1

あなたがオブジェクトクラスに一致するコンストラクタ(またはコンバータまたは任意)を作成する場合は、ストリーム操作を使用することができます。

public class MyObject { 
    private String name; 
    private String surname; 
    private String sex; 

    public MyObject(){} 

    public static MyObject fromStringArr(String[] csvVals) { 
     assert csvVals != null && csvVals.length >= 3; 

     MyObject m = new MyObject(); 
     m.name = csvVals[0]; 
     m.surname = csvVals[1]; 
     m.sex = csvVals[2]; 
     return m; 
    } 

    //Getters and setters for MyObject... 
    //.... 
} 

次に、オブジェクトの種類を直接読み取ることができます。

CSVReader reader = new CSVReader(new FileReader("file.csv")); 
List<MyObject> myEntries = reader.readAll().stream().skip(1).map(MyObject::fromStringArr).collect(Collectors.toList()); 
+0

メタ情報が含まれているので、最初の行をスキップする必要があると思います。 – gevorg

+1

@gevorgが最初の行をスキップするように編集されました – Mshnik

関連する問題