2015-11-21 4 views
3

У меня есть файл CSV, который имеет четыре столбца и несколько строк:Сохранение в нескольких массивов

а, б, в, г/п

а, б, в, г/н

Я успешно прочитал содержимое файла .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); 
    } 

ответ

1

Отделить их от массивов внутри одной петли. Я бы рекомендовал использовать ArrayList, если вы не знаете количество строк в вашем файле csv.

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

Большое вам спасибо – Chrystian

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).