0

Java で CSV ファイルを 2D 配列に変換する際に問題が発生しています。私はこれを回避するのに最も長い道のりを歩んでいるかもしれませんが、エラーが発生する理由を理解できないようです. 各行と列には、それぞれ 25 個の要素があると想定されています。これが私のコードです:

BufferedReader CSVFile = new BufferedReader(new FileReader(fileName));

String dataRow = CSVFile.readLine();
// Read first line.
// The while checks to see if the data is null. If 
// it is, we've hit the end of the file. If not, 
// process the data.

while (dataRow != null) {
    dataRow.split(",");
    list.add(dataRow);
    dataRow = CSVFile.readLine();

    // Read next line of data.
}
// Close the file once all data has been read.
CSVFile.close();

String[] tokens = null;
Object[] test = list.toArray();

String[] stringArray = Arrays.copyOf(test, test.length, String[].class); //copies the object array into a String array 

//splits the elements of the array up and stores them into token array

for (int a = 0; a < test.length; a++) {
    String temp = stringArray[a];
    tokens = temp.split(",");

}

//converts these String tokens into ints

int intarray[] = new int[tokens.length];

for (int i = 0; i < tokens.length; i++) {

    intarray[i] = Integer.parseInt(tokens[i]);

}

//attempts to create a 2d array out of a single dimension array
int array2d[][] = new int[10][3];

for (int i = 0; i < 25; i++) {
    for (int j = 0; j < 25; j++) {
        array2d[i][j] = intarray[(j * 25) + i];

    }
}

ArrayList が最初の String 配列にコピーされたときにエラーが発生したと思いますが、確信が持てません。ファイルには 25 列と 25 行があります。私が取得し続けるエラーは、配列がインデックス 25 で範囲外であるということです。どんな入力でも大歓迎です。ありがとう!

4

2 に答える 2

3
for (int a = 0; a < test.length; a++) {
    String temp = stringArray[a];
    tokens = temp.split(","); //< -- OLD VALUE REPLACED  WITH NEW SET OF TOKENS

}

tokens これまでに使用されたすべてのトークンではなく最後に使用された文字列のトークンのみが含まれます。したがってtokens.length == 25、アクセスtokens[25]ArrayOutOfBounds例外です。

以下の変更を行う必要があります

ArrayList<String> tokens = new ArrayList<String>();
...
tokens.addAll(Arrays.asList(temp.split(","))); 

配列からの ArrayList の作成では、要素の配列を arrayList に追加する方法について説明します。

于 2013-02-27T02:32:50.770 に答える
1

ところで、独自の CSV 解析を行うことは、おそらく最も効率的な時間の使い方ではありません (これが宿題でない限り)。これを処理するための優れたライブラリ (opencsv、commons-lang3) があり、引用、空のトークン、構成可能な区切り記号などを処理します....

commons-lang3 の例を次に示します。

StrTokenizer tokenizer = StrTokenizer.getCSVInstance();

while (...) {
    tokenizer.reset(dataLine);
    String tokens[] = tokenizer.getTokenArray();
    ...
}

これで、データを解析するというありふれた行為ではなく、データに対して実行したいことの実際のロジックに自由に集中できるようになります。

また、トークンをフラット リストとして収集することにのみ関心がある場合は、次のようにします。

StrTokenizer tokenizer = StrTokenizer.getCSVInstance();
List<String> allTokens = new ArrayList<String>();
while (...) {
    tokenizer.reset(dataLine);
    allTokens.addAll(tokenizer.getTokenList());
    ...
}
于 2013-02-27T05:19:56.317 に答える