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

时间:2015-11-21 02:20:05

标签: java arrays csv

我有一个包含四列和多行的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 个答案:

答案 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许可证)。