Игнорировать нежелательные столбцы с помощью CSVBeanReader

Я надеюсь, что добрые люди здесь могут помочь мне с моей ситуацией с CSV. Мне нужно только прочитать первые 3 столбца в CSV, который я использую. Я не могу контролировать количество столбцов в CSV-файле, и заголовки недоступны. Я попытался использовать частичное чтение с помощью CSVBeanReader (https://super-csv.github.io/super-csv/examples_partial_reading.html), но я продолжаю получать ошибку «массив nameMapping и количество прочитанных столбцов». Я хотел бы спросить, работает ли пример частичного чтения для версии supercsv 2.4.0, которую я сейчас использую. См. ниже код, который я использовал, который я создал по образцу примера частичного чтения.

public class MainPartialRead {

public void partialRead() throws Exception {
    ICsvBeanReader beanReader = null;
    String csv_filename = "test2.csv";
    try {
        beanReader = new CsvBeanReader(new FileReader(csv_filename), CsvPreference.STANDARD_PREFERENCE);
        beanReader.getHeader(true); // skip past the header (we're defining our own)
        System.out.println("beanreader Length: " + beanReader.length());

        // only map the first 3 columns - setting header elements to null means those columns are ignored
        final String[] header = new String[]{"column1", "column2", "column3", null, null, null, null, null,
            null, null};

        // no processing required for ignored columns
        final CellProcessor[] processors = new CellProcessor[]{new NotNull(), new NotNull(),
            new NotNull(), null, null, null, null, null, null, null};

        beanCSVReport customer;
        while ((customer = beanReader.read(beanCSVReport.class, header, processors)) != null) {
            System.out.println(String.format("lineNo=%s, rowNo=%s, customer=%s", beanReader.getLineNumber(),
                    beanReader.getRowNumber(), customer));
        }
    } finally {
        if (beanReader != null) {
            beanReader.close();
        }
    }

}

Вот пример файла CSV, который я использую:

466,24127,abc,53516
868,46363,hth,249

person ides    schedule 26.06.2018    source источник
comment
где заголовки в образце CSV?   -  person gagan singh    schedule 26.06.2018
comment
грустно констатировать, что заголовков нет.   -  person ides    schedule 27.06.2018


Ответы (1)


вы не упомянули полное сообщение об ошибке.

Exception in thread "main" java.lang.IllegalArgumentException: the nameMapping array and the number of columns read should be the same size
(nameMapping length = 10, columns = 4)

Отсюда очень ясно, в чем дело. У вас всего 4 столбца в CSV-файле, но вы упомянули сопоставление для 10 столбцов, 7 из которых нулевые.

Удаление 6 нулей из заголовка и процессоров устраняет проблему.

еще один момент, который следует отметить. Следующий код пропускает первую строку, предполагая, что она является заголовком, как вы указали, но на самом деле это не строка заголовка. Вы не должны вызывать этот метод.

beanReader.getHeader(true);
person gagan singh    schedule 27.06.2018
comment
да, вы правы в своем наблюдении за сопоставлением заголовков в коде, и спасибо за указание на поведение beanReader.getHeader. Мне больше интересно узнать, работает ли пример частичного чтения, доступный на сайте superCSV (см. ссылку в моем вопросе), как представлено на их сайте. Мои попытки воспроизвести пример не увенчались успехом, как показано в представленном коде. Мне нужно прочитать только первые 3 столбца моего CSV-файла, который может иметь любое количество столбцов, и игнорировать остальные. Мне также нужно, чтобы процессоры анализировали эти 3 столбца, чтобы обеспечить достоверность. Спасибо! - person ides; 27.06.2018
comment
Как я уже сказал в своем ответе, частичное чтение работает путем ввода правильного количества нулей. У вас есть 7 нулей. Замените то же самое на 1 null. 3 именованных столбца и 1 нулевой (игнорируемый) столбец. Оно работает. Теперь, если ваш вопрос в том, что вы даже не знаете количество столбцов, то вам нужно прочитать одну строку и понять это. В сопоставлении столбцов передается правильное количество столбцов, именованных или нулевых. Я запустил ваш образец, и он работает. - person gagan singh; 27.06.2018