2014-01-15 1 views
1

Am using supercsv CsvBeanWriter для записи значений в файл csv.Как написать список <String> в файл csv и прочитать его обратно с помощью supercsv

образец класс:

public class Employee { 
    private String name; 

    private int empId; 

    List<String> phoneNumbers; 
} 

Выход я получаю:

name,empId,phoneNumbers 
vijay,1,"[123, 456]" 

Обратите внимание, как List<String> phoneNumbers написано в []

Мой вопрос, как я могу читать его обратно Employee class (bean) с использованием supercsv.

Я пробовал использовать CsvBeanReader & CsvDozerBeanReader, но не смог прочитать List<String>.

Я получаю исключение нелегальной торговли. Будем благодарны за любые указатели!

Полный код:

public class DozerBeanReader { 
public static void main(String [] args){ 
    ICsvDozerBeanReader beanReader = null; 

    try { 
     beanReader = new CsvDozerBeanReader(new FileReader("Employee.csv"), 
       CsvPreference.STANDARD_PREFERENCE); 

     String [] header = beanReader.getHeader(true); // ignore the header 

     Class<?> [] hintTypes = {String.class, Integer.class, List.class}; 

     beanReader.configureBeanMapping(Employee.class, header, hintTypes); 

     Employee readEmp1 = beanReader.read(Employee.class); 
     readEmp1.toString(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 
} 

ответ

1

Вы полагаться на то, что ваш List телефонных номеров записывается в виде одного столбца CSV, используя формат списка toString(), например [123, 456].

Вы будете получать что-то исключение, как следующее:

org.dozer.MappingException: Illegal object type 
for the method 'setPhoneNumbers'. 
Expected types: 
java.util.List 
Actual types: 
java.lang.String 

потому что бульдозер не имеет ни малейшего представления о том, как преобразовать строку [123, 456] в List. Вы можете сделать это, но вам нужно написать cell processor, чтобы преобразовать эту строку обратно в List. Если ваши номера телефонов - это чисто цифры, которые не должны быть слишком сложными, но если ваши номера телефонов имеют запятые, тогда все будет беспорядочно!

Я бы рекомендовал записывать каждый номер телефона в отдельном столбце - это делает его намного проще (для тех, кто читает ваш файл, включая вас!).

Все, что вам нужно сделать, это использовать CsvDozerBeanReader и CsvDozerBeanWriter с indexed mapping.

Вот пример - ключевым элементом является индексированный отображение:

String[] fieldMapping = new String[] { "name", 
    "empId", "phoneNumbers[0]", "phoneNumbers[1]" }; 
  • Я определил 2 номер телефона столбцы - если ваш список будет больше, то просто добавить несколько столбцов
  • I мог бы использовать полевое сопоставление для заголовка, но решил использовать более читаемый настраиваемый заголовок
  • Вам не нужны подсказки, как у вас в вашем вопросе
  • Я использовал StringReader/StringWriter просто сделать пример простой

Пример:

// create employee to write/read 
Employee employee = new Employee(); 
employee.setEmpId(1234); 
employee.setName("Vijay"); 
employee.setPhoneNumbers(Arrays.asList("123", "456")); 

// the CSV header 
String[] header = new String[] { "name", 
    "empId", "phoneNumber1", "phoneNumber2" }; 

// the field mapping 
String[] fieldMapping = new String[] { "name", 
    "empId", "phoneNumbers[0]", "phoneNumbers[1]" }; 

// write the employee 
StringWriter out = new StringWriter(); 
ICsvDozerBeanWriter writer = 
    new CsvDozerBeanWriter(out, 
    CsvPreference.STANDARD_PREFERENCE); 
writer.configureBeanMapping(Employee.class, fieldMapping); 
writer.writeHeader(header); 
writer.write(employee); 
writer.flush(); 

// read the employee 
ICsvDozerBeanReader reader = 
    new CsvDozerBeanReader(new StringReader(out.toString()), 
    CsvPreference.STANDARD_PREFERENCE); 
reader.configureBeanMapping(Employee.class, fieldMapping); 
reader.getHeader(true); // ignore header 
Employee e = reader.read(Employee.class); 
System.out.println(e); 

Предполагая, что вы написали метод toString(), это должно напечатать

Employee [name=Vijay, empId=1234, phoneNumbers=[123, 456]] 
+1

Любая идея, как установить String [] fieldMapping когда Я точно не знаю, сколько элементов в списке? – Vijay