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

Я пытаюсь передать CSV-файл с помощью opencsv. CSV-файл имеет три столбца (,). Как мне разобрать каждую строку в мой массив с соответствующими значениями? См. код ниже.

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