Как игнорировать пустые строки? Я использую приведенный ниже фрагмент кода, и он не игнорирует пустые строки. Доступна какая-либо конфигурация указателя в парсере 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
это пустая строка. Я конвертирую файл xlsx в csv, и когда в xlsx есть пустая строка, в CSV она заканчивается как ,,,
.withIgnoreEmptyLines, похоже, не работает
Итак, каков ваш фактический результат (в отличие от ожидаемого)?
фактический вывод: d1, d2, d3
Итак, ваш фактический результат соответствует ожидаемому результату? Тогда в чем проблема?
Плохое название. Отредактируйте, чтобы описать вашу конкретную техническую проблему. Кроме того, если вы используете библиотеку CSV-файл Apache Commons, скажите об этом явно и, возможно, сделайте ссылку на проект для справки.




Парсер 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;
}
,,,- это пустая строка или непустая строка без значений?