嘿所以我正在研究这个读取CSV文件的程序,我需要制作一个可以在值上返回整列的方法。
目前我这样做:
List<String> data = new LinkedList<>();
for(int i = 0; i < getRowCount(); i++){
data.add(getRow(i).get(column));
}
getRow()是这样的:
List<String> data = new LinkedList<>();
String column;
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
for(int i = 0; i < row; i++){
bufferedReader.readLine();
}
column = bufferedReader.readLine();
for(String col: column.split(columnSeparator.toString())){
data.add(col);
}
} catch (IOException e) {
e.printStackTrace();
}
它有效。但缺点是,如果文件中的列太多,则需要太长时间。它需要27秒,即7500行和9列。在35000行和16列上超过10分钟。你知道我怎么能让它更快?
答案 0 :(得分:1)
尝试阅读一次文件:
List<String> getColumn(int column) {
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {
List<String> data = new LinkedList<>();
String line = bufferedReader.readLine();
while (line != null) {
String cols[] = line.split(columnSeparator.toString());
data.add(cols[column]);
line = bufferedReader.readLine();
}
return data;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
答案 1 :(得分:0)
我建议你试试这个
DataType<T> listRef = getRowCount();
for(int i = 0; i < listRef.size(); i++)
{
data.add(getRow(i).get(column));
}
当你在for语句中调用它时,每次执行getRowCount都会被执行,你最终会得到所有的行但是在内部我相信调用它会执行该方法getRowCount()。size()次并且你可能不会我想多次阅读一个文件
答案 2 :(得分:0)
您正在做的是以下内容:
..等等。 显然这不是很有效(你在O(n²)做的东西,n =行数)。
如果你这样做,你可以大大改善你的代码:
......等等。 所以先要一次读完所有的行:
List<String> lines = new LinkedList<>();
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null)
lines.add(line);
} catch (IOException e) {
e.printStackTrace();
}
然后,您可以遍历这些行将它们拆分成列并提取您感兴趣的数据:
List<String> data = new LinkedList<>();
for(String line : lines)
data.add(line.split(columnSeparator.toString())[column]);
当然,这仍然需要一些错误处理:)