Использование SuperCsv с несколькими столбцами переменных

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

 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();
                }
        }
}

Кроме того, что, если необязательные столбцы находятся не в конце, а в центре или где-то еще?


person v0ld3m0rt    schedule 13.08.2013    source источник


Ответы (1)


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

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

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

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

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

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

or

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

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

person James Bassett    schedule 14.08.2013