我使用BufferedReader读取。csv文件。读取文件和提取数据没有问题。然而,我遇到的问题是我必须硬编码我的数组声明。例如:
String[][] numbers=new String[5258][16];
我正在使用的.csv文件有5258行和16列。我希望能够做这样的事情:
String[][] numbers=new String[rowsInFile][16];
换句话说,我希望变量'rowsInFile'等于文件中的行数(我不想计算列数,因为我将通过这个程序运行的每个.csv文件都有16列)。
这是我目前为止的代码:
int row = 0;
int col = 0;
String fileInput = JOptionPane.showInputDialog(null,
"Please enter the path of the CSV file to read:");
File file = new File(fileInput);
BufferedReader bufRdr;
bufRdr = new BufferedReader(new FileReader(file));
String line = null;
//get rows in the file
int rowsInFile = 0;
while(bufRdr.readLine() != null) {
rowsInFile++;
row++;
}
String[][] numbers=new String[rowsInFile][16];
//read each line of text file
row = 0;
while((line = bufRdr.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line,",");
col=0;
while (st.hasMoreTokens()) {
//get next token and store it in the array
numbers[row][col] = st.nextToken();
col++;
}
row++;
}
然而,我得到一个空指针异常。你知道我该怎么做吗?
注:是的,这段代码被try/catch语句包围。
问题是,一旦你通过了BufferedReader
,你就不能再通过它了。换句话说,您必须使用新的BufferedReader
。
bufRdr = new BufferedReader(new FileReader(file));
row = 0;
while((line = bufRdr.readLine()) != null) {
或者,您可以使用动态数组结构,如ArrayList<String[]>
或LinkedList<String[]>
来存储行。
LinkedList<String[]> numbers = new LinkedList<String[]>();
while( (line = bufRdr.readLine()) != null ) {
numbers.add(line.split(","));
}
用numbers.get(i)[j]
代替numbers[i][j]
不要使用数组,而是使用List之类的动态数组。例如:
List<String[]> data = new ArrayList<String[]>();
还使用String的split()
方法将简化行加载
您的问题是BufferedReaders的工作方式是一直读到文件的末尾,然后它们就卡在那里了。您的代码需要读取文件两次,但是由于已经达到了EOF, BufferedReader仍然返回null。我倾向于通过将行填充到ArrayList中,并使用size()方法来获得行数来解决这个问题。源代码看起来像这样:
int rowsInFile=0;
ArrayList<String> lines = new ArrayList<String>();
String tmp = "";
while(tmp=bugRdr.readLine())
{
lines.add(tmp);
}
rowsInFile = lines.size();
String[][] numbers = new String[rowsInFile][16];
int row = 0;
for(String line : lines)
{
StringTokenizer st = new StringTokenizer(line,",");
col=0;
while (st.hasMoreTokens()) {
//get next token and store it in the array
numbers[row][col] = st.nextToken();
col++;
}
row++;
}