将CSV文件转换为2D Array Java

时间:2013-02-27 02:30:04

标签: java arrays csv multidimensional-array

我在使用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处超出界限。任何输入都将非常感激。谢谢!

2 个答案:

答案 0 :(得分: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(","))); 

Create ArrayList from array解释了如何将元素数组添加到arrayList。

答案 1 :(得分: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());
    ...
}