2

csvファイルを読み出そうとしています。私のコードでは、csvファイルの行を読み取りました。そのため、arraylistを使用して、行の各項目をarraylistに追加します。

行を読み取った後、他の配列リストに配列リストを格納し、次の行を読み取るなどに進みます。

ここにいくつかの質問と1つの問題があります。

1)配列リストにアイテムを追加するとき、それは常にリストのenに追加されますか(コードのようにアイテムを追加する特定の場所を指定しない場合)?これにより、csvファイルの順序が維持されます。

2)次の行の読み取りを準備するためにarraylist datatempをクリアすると、配列リストデータの内容もクリアされることがわかりました。コードがそうするのを防ぐにはどうすればよいですか?

3)私が持っているarraylistデータから通常の配列を作成する方法はありますか?

4)csvファイルを読み取る私の方法は正しいですか、それとももっと良い方法がありますか?

public class CSVReader {    

public void ReadCSV (String csvfilepath) {

    BufferedReader CSVFile = null;
    String dataRow = null;
    ArrayList<Float> datatemp = new ArrayList<Float>(); 
    ArrayList<ArrayList<Float>> data = new ArrayList<ArrayList<Float>>(); 

    try {
        CSVFile = new BufferedReader(new FileReader(csvfilepath));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    try {
        dataRow = CSVFile.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }

    while (dataRow != null){
        String[] dataArray = dataRow.split(",");
        for (String item:dataArray) {
            datatemp.add(Float.valueOf(item));
        }
        try {
            dataRow = CSVFile.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }

        data.add(datatemp);
        datatemp.clear();
    }

    try {
        CSVFile.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
} 
4

4 に答える 4

2

1) これにより、csv ファイルの順序が維持されます。

はい

2) 自分のコードがそうしないようにするにはどうすればよいですか?

毎回新しい tempArrayList を作成する必要があります。

while (dataRow != null){
    datatemp = new ArrayList<Float>();

3) 私が持っている arraylist データから通常の配列を作成する方法はありますか?

配列リストの配列を作成できます。

ArrayList[] array = data.toArray(new  ArrayList[data.size()]);

その後、再帰的に2D配列を作成できますが、扱いやすいリストのリストに固執します。

4) csv ファイルを読み取る私の方法は正しいですか、それとももっと良い方法がありますか?

ライブラリを使用してください。テスト済みのライブラリが多数あります。CSV ファイルを正しく解析することは、一見したよりもはるかに困難です。

于 2012-12-10T16:22:07.447 に答える
1

広告 1. ArrayList リファレンスを読みましたか? メソッド add() 「指定された要素をこのリストの末尾に追加します。」

広告 2. 参照がどのように機能するかまだわかっていないようです。ループ内で datatemp を宣言するだけで、クリアしないでください。問題なく動作するはずです。

広告 3. クラス リファレンスを読んでください。配列する方法があります。この例では、次のように使用します。

Float[] array = data.toArray(new Float[data.size()])

広告 4. 学校の課題でない場合は、図書館を利用してください。このスレッドを確認してください: CSV API for Java

PS: Oracle のドキュメントを使用してください。すべての回答は次のとおりです: http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

于 2012-12-10T16:27:47.933 に答える
0

詳細を調べずに、http://opencsv.sourceforge.net/を試してみませんか?自分で使って、いいこと、信じて

于 2012-12-10T16:19:47.823 に答える
0

データ配列に datatemp を追加しますが、配列をクリアします。データ内のデータもクリアされます。次のように配列をコピーする必要があります。

data.add(new ArrayList<Float>( datatemp ) );

オープン ソースの csv ライブラリを使用し、解析を自分で行わないことをお勧めします。

于 2012-12-10T16:27:24.533 に答える