Разбор на csv файл към методи за получаване на клас с opencsv

Опитвам се да предам csv файл с помощта на opencsv. Csv файлът има три колони (,). Как да анализирам всеки ред в моя arraylist със съответните стойности? Вижте кода по-долу.

public class Customer { 

    private String accNum;  
    private String fName;   
    private String lName;   

    public Customer(String accNum, String fName, String lName) {        

    this.accNum = accNum;
    this.fName = fName;
    this.lName = lName;
     }

    //getters & setters
    ...
}

public class CustomerList{

public void getCustList(File file) throws IOException {     
    List <Customer> custList = new ArrayList <Customer>();
    CSVReader reader = new CSVReader (new FileReader (file));
    String [] header = reader.readNext();       
    List<String[]> cList = reader.readAll();

    for (int i =0 ; i < cList.size(); i++)
    {
        String[] line = cList.get(i); //not sure how to do this
        for (String list: line)
        {
            custList.add( new Customer (list));// constructor takes three arguments
        }
    }
}

person xiphias    schedule 09.06.2012    source източник


Отговори (2)


Това е нещо като JDBC ResultSet.

List <Customer> custList = new ArrayList <Customer>();
CSVReader reader = new CSVReader (new FileReader (file));
String[] header = reader.readNext();
if (header == null)
{
    throw new RuntimeException("No header");
}

String[] row;
while ((row = reader.readNext()) != null)
{
    if (row.length != 3) {
        throw new RuntimeException("Unexpected number of entries: " + row.length);
    }
    custList.add(new Customer(row[0], row[1], row[2]));
}
person John Watts    schedule 09.06.2012
comment
Можете да го направите, както е споменато в отговора по-долу, но препоръчвам да повторите редовете с readNext, както очертах тук. По този начин не сте принудени да зареждате целия CSV файл в паметта. Вместо това можете да го обработите като поток. Зависи дали очаквате голям брой редове. - person John Watts; 10.06.2012
comment
Използвах вашия метод, работи. Засега обаче трябваше да премахна 'if (row.length != 3)'. Пропуснах да спомена, че csv файлът не е последователен. Има няколко сценария без фамилно име, което води до две запетаи в края на реда. Или няма собствено име, редовете могат или не могат да имат запетая в края. Поради това става малко по-сложно. Прав си, повторението на редовете е по-добро, тъй като csv файловете имат повече от 100 000 реда. Благодаря, Джон, много го оценявам. - person xiphias; 10.06.2012

Бих модифицирал for цикъла в нещо подобно

for(int i = 0; i < cList.size(); i++) {
    String[] line = cList.get(i);
    custList.add(new Customer(line[0], line[1], line[2]));
}

Ако приемем, разбира се, че колоните са в реда accNum, fName, lName.

person Michael    schedule 09.06.2012
comment
Те са в този ред, но не е задължително да са последователни. някои редове може да не съдържат един от елементите, водещи до ,, заедно и т.н. вижте. Не изглежда, че opencsv може да се справи с тези събития, както бих искал. - person xiphias; 10.06.2012