2013-08-13 1 views
4

Я рассматривал этот пример из Super CSV website, который показывает, что дата рождения является необязательным столбцом. Что произойдет, если у меня есть несколько дополнительных столбцов? Как изменится код?Использование SuperCsv с несколькими столбцами переменной

private static void readVariableColumnsWithCsvListReader() throws Exception { 

     final CellProcessor[] allProcessors = new CellProcessor[] { new UniqueHashCode(), // customerNo (must be unique) 
       new NotNull(), // firstName 
       new NotNull(), // lastName 
       new ParseDate("dd/MM/yyyy") }; // birthDate 

     final CellProcessor[] noBirthDateProcessors = new CellProcessor[] { allProcessors[0], // customerNo 
       allProcessors[1], // firstName 
       allProcessors[2] }; // lastName 

     ICsvListReader listReader = null; 
     try { 
       listReader = new CsvListReader(new FileReader(VARIABLE_CSV_FILENAME), CsvPreference.STANDARD_PREFERENCE); 

       listReader.getHeader(true); // skip the header (can't be used with CsvListReader) 

       while((listReader.read()) != null) { 

         // use different processors depending on the number of columns 
         final CellProcessor[] processors; 
         if(listReader.length() == noBirthDateProcessors.length) { 
           processors = noBirthDateProcessors; 
         } else { 
           processors = allProcessors; 
         } 

         final List<Object> customerList = listReader.executeProcessors(processors); 
         System.out.println(String.format("lineNo=%s, rowNo=%s, columns=%s, customerList=%s", 
           listReader.getLineNumber(), listReader.getRowNumber(), customerList.size(), customerList)); 
       } 

     } 
     finally { 
       if(listReader != null) { 
         listReader.close(); 
       } 
     } 
} 

Также, если дополнительные столбцы находятся не в конце, а в центре или где-то еще?

ответ

2

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

Если, как пример, только 1 столбец является необязательным, вам просто нужно подсчитать количество прочитанных столбцов и использовать соответствующий массив ячеек-процессоров. Не имеет значения , где этот необязательный столбец, потому что он все еще предсказуем.

Если, однако, более 1 столбца является необязательным, у вас проблемы. Например, если middleName и city не являются обязательными в следующем файле CSV:

firstName,middleName,lastName,city 
Philip,Fry,New York 

Это не может быть прочитана как:

firstName="Philip", middleName="Fry", lastName="New York", city=null 

или

firstName="Philip", middleName=null, lastName="Fry", city="New York" 

Это уже не предсказуемы. Вы можете проверить данные в столбце, чтобы определить, что должен представлять этот столбец (например, дата имеет /), но это не очень надежное, и даже тогда вам даже придется прочитать несколько строк, чтобы понять это из.