我需要从csv文件中读取数据,并且对我来说更方便的是放在2D数组中(我认为这是处理这个“计划”数据的最简单方法)。 每个文件行包含以下格式的信息:
Instructor, Course, Group, Student, Result
如下例:
Paul Schwartz,Introduction to Computer Architecture,I1,Ben Dunkin,88
Muhamed Olji,Object Oriented Programming,I4,Mike Brown,73
但我的代码需要一些简化。但我不知道如何让它变得更容易,并且要求 你 。
代码:
private String[][] fileContent(String pathToCSVFile) {
final int ROWS = 100;
final int COLUMNS = 5;
String fileData[][] = new String[ROWS][COLUMNS];
Scanner scanner = new Scanner(pathToCSVFile);
boolean done = false;
int i, j;
while (!done) {
for (i = 0; i >= 0; i++) {
for (j = 0; j >= 0; j++) {
String str[] = scanner.nextLine().split(",");
for (int element = 0; element < str.length; element++) {
fileData[i][element] = str[element];
if (i >= ROWS) {
Arrays.copyOf(fileData, fileData.length * 2);
}
}
}
}
if (!scanner.hasNextLine()) done = true;
}
return fileData;
}
Arrays.copyOf(fileData, fileData.length * 2)
)更好的方法?答案 0 :(得分:3)
使用openCSV,您可以获得包含所有行的列表并将其转换为数组(或只保留列表):
try (CSVReader reader = new CSVReader(new BufferedReader(
new FileReader(pathToCSVFile)));) {
List<String[]> lines = reader.readAll();
return lines.toArray(new String[lines.size()][]);
}
(使用Java 7 try-with-resources语法)
答案 1 :(得分:1)
首先,要小心那些for循环。它们是“几乎”未定义的循环,因为它们以i开始,j = 0,并且当&gt; = 0时循环(总是,直到它们溢出为负数)。 你为什么还需要它们呢?我和你在一起思考(元素)你做完了吧? 这样的事情(我没试过,只是为了解释这个概念)
private String[][] fileContent(String pathToCSVFile) {
final int ROWS = 100;
final int COLUMNS = 5;
String fileData[][] = new String[ROWS][COLUMNS];
Scanner scanner = new Scanner(pathToCSVFile);
boolean done = false;
int i=0;
while (!done) {
String str[] = scanner.nextLine().split(",");
for (int element = 0; element < str.length; element++) {
fileData[i][element] = str[element];
if (i >= ROWS) {
Arrays.copyOf(fileData, fileData.length * 2);
}
}
if (!scanner.hasNextLine())
done = true;
else
i++;
}
return fileData;
}
顺便问一下,为什么不使用像ArrayList这样的对象?它会让你的生活更轻松,所以你不必担心内存处理。您只需添加新对象。
类似于ArrayList <ArrayList <String>>