我有一个包含四列和多行的CSV文件:
a,b,c,d / n
a,b,c,d / n
我成功读取了.CSV文件的内容并将它们放入ArrayList中。如何将每列分成一个数组?我想拥有arrayA,ArrayB,ArrayC,ArrayD。
Scanner scan = new Scanner(new File(copyUri));
ArrayList<String[]> records = new ArrayList<String[]>();
String[] record = new String[2];
while(scan.hasNext())
{
record = scan.nextLine().split(",");
records.add(record);
}
答案 0 :(得分:1)
将它们分成同一循环内的数组。如果您不知道csv文件中的行数,我建议使用ArrayList。
Scanner scan = new Scanner(new File(copyUri));
ArrayList<String[]> records = new ArrayList<String[]>();
String[] record = new String[2];
ArrayList<String[]> a = new ArrayList<String[]>();
ArrayList<String[]> b = new ArrayList<String[]>();
ArrayList<String[]> c = new ArrayList<String[]>();
ArrayList<String[]> d = new ArrayList<String[]>();
while(scan.hasNext())
{
record = scan.nextLine().split(",");
a.add(record[0]);
b.add(record[1]);
c.add(record[2]);
d.add(record[3]);
records.add(record);
}
另一种效率较低的解决方案是查找记录列表的大小,使用此大小创建数组并使用数据填充它们。
Scanner scan = new Scanner(new File(copyUri));
ArrayList<String[]> records = new ArrayList<String[]>();
String[] record = new String[2];
while(scan.hasNext()) {
record = scan.nextLine().split(",");
records.add(record);
}
int rows = records.size();
String[] a = new String[rows];
String[] b = new String[rows];
String[] c = new String[rows];
String[] d = new String[rows];
int j = 0;
for (String[] temp : records) {
a[j] = temp[0];
b[j] = temp[1];
c[j] = temp[2];
d[j] = temp[3];
j++;
}
我得到的第三个想法是初始化具有一定大小的数组(例如:5)并随时调整数组的大小,但我相信这是效率最低的,因为每次你必须将元素移动到新数组调整大小。
答案 1 :(得分:0)
使用univocity-parsers'ColumnProcessor
可靠地为您完成此操作:
CsvParserSettings parserSettings = new CsvParserSettings();
// To get the values of all columns, use a column processor
ColumnProcessor rowProcessor = new ColumnProcessor();
parserSettings.setRowProcessor(rowProcessor);
CsvParser parser = new CsvParser(parserSettings);
//This will kick in our column processor
parser.parse(new FileReader(new File(copyUri)));
//Finally, we can get the column values:
Map<Integer, List<String>> columnValues = rowProcessor.getColumnValuesAsMapOfIndexes();
比手工清洁,更快速,更容易。这将处理诸如具有不同列数的行之类的情况,并将null
添加到列表中,而不是向您抛出异常。
披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。