将CSV文件内容存储到多个数组中

3

我有一个包含四列和多行的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);
    }
2个回答

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)初始化你的数组,并在需要时调整数组大小,但我认为这是最低效的,因为每次调整大小时都必须将元素移动到新数组中。


0
使用 univocity-parsersColumnProcessor 可以可靠地为您完成此操作:
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许可证)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接