Парсер Apache CSV: проблема с игнорированием пустых строк

Как игнорировать пустые строки? Я использую приведенный ниже фрагмент кода, и он не игнорирует пустые строки. Доступна какая-либо конфигурация указателя в парсере CSV для решения этой проблемы?

 public CSVParser parseCSV(InputStream inputStream) {
        try {
            return new CSVParser(new InputStreamReader(inputStream, StandardCharsets.UTF_8), CSVFormat.DEFAULT
                    .withFirstRecordAsHeader()
                    .withIgnoreHeaderCase()
                    .withSkipHeaderRecord()
                    .withIgnoreEmptyLines()
                    .withTrim());
        } catch (IOException e) {
            throw new IPRSException(e);
        }
    }

Образец файла

h1,h2,h3
d1,d2,d3
,,,

Ожидаемый результат

d1,d2,d3

,,, - это пустая строка или непустая строка без значений?

dave 11.10.2018 08:34

это пустая строка. Я конвертирую файл xlsx в csv, и когда в xlsx есть пустая строка, в CSV она заканчивается как ,,,

Minisha 11.10.2018 08:47

.withIgnoreEmptyLines, похоже, не работает

Minisha 11.10.2018 08:47

Итак, каков ваш фактический результат (в отличие от ожидаемого)?

dave 11.10.2018 09:00

фактический вывод: d1, d2, d3

Minisha 11.10.2018 09:21

Итак, ваш фактический результат соответствует ожидаемому результату? Тогда в чем проблема?

dave 11.10.2018 10:36

Плохое название. Отредактируйте, чтобы описать вашу конкретную техническую проблему. Кроме того, если вы используете библиотеку CSV-файл Apache Commons, скажите об этом явно и, возможно, сделайте ссылку на проект для справки.

Basil Bourque 04.12.2018 07:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
625
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Парсер Apache CSV не поддерживает пустые строки из коробки, поэтому в итоге пришлось написать собственный код.

private boolean isEmpty(CSVRecord csvRecord){
        if (null == csvRecord) return true;
        for (int i = 0; i < csvRecord.size(); i++) {
            if (StringUtils.isNotBlank(csvRecord.get(i))) {
                return false;
            }
        }
        return true;
    }


    public List<Map<String, Object>> getMapFromCSV(InputStream inputStream) {
        try {
            CSVParser parser = parseCSV(inputStream);
            return getMap(parser.getRecords().stream()
                    .sequential().filter(v -> !isEmpty(v))
                    .collect(Collectors.toList()), parser.getHeaderMap());
        } catch (IOException e) {
            throw new Exception(e);
        }
    }

  private List<Map<String, Object>> getMap (List<CSVRecord> records, Map<String, Integer> headers) {
        Map<Integer, String> headerMap = formatHeaderMap(headers);
        List<Map<String, Object>> data = new ArrayList<>();
        for (int i = 1; i < records.size(); i++) {
            Map<String, Object> map = new HashMap<>();
            try {
                CSVRecord record = records.get(i);
                for (int j = 0; j < record.size(); j++) {
                    map.put(headerMap.get(j), record.get(j));
                }
                data.add(map);
            } catch (Exception e) {
                throw new Exception(e);
            }
        }
        return data;
    }


 private Map<Integer, String> formatHeaderMap(Map<String, Integer> map) {
        Map<Integer, String> data = new HashMap<>();
        map.forEach((k , v) -> data.put(v, inputSanitizerForUtf8(k)));
        return data;
    }

Другие вопросы по теме