在 OpenCSV 中修剪前导空格和尾随空格

2022-09-04 22:44:35

我正在使用OpenCSV从文件中读取一些逗号分隔的值。我不确定如何修剪前导空格和尾随空格。当然,我可以做到,但如果不是这样会更干净。在文档中没有指定此类选项。CSVReaderString.trim()


答案 1

你能切换到SuperCSV吗?它有一个选项来忽略其CsvPreference.Builder上的周围空间。这是一个更高级的图书馆,IMO。如果该首选项不能执行所需的操作,则始终可以扩展 Tokenizer 类并重写 readColumns。否则,它看起来不是很精细,需要您扩展和覆盖readNext。这可能有效:OpenCSVCSVReader

class MyReader extends au.com.bytecode.opencsv.CSVReader {
    @Override public String[] readNext() throws IOException {
        String[] result = super.readNext();
        for (int i=0; i<result.length; i++) result[i] = result[i].trim();
        return result;
    }
}

答案 2

如果您正在使用Bean映射和OpenCSV,我个人更喜欢扩展MapingStrategy,因为它处理对其相关字段的最终值分配。假设您的字段是制表符分隔的。然后,您可能很难扩展 CSVReader。此外,需要较少的编码。

在下面的示例中,我使用的是 ColumnPositionMappingStrategy,但您的策略可以是任何其他 MappingStrategy,因为 populateNewBean 位于父抽象类中。

private <T> MappingStrategy<T> createMappingStrategy() {
    return new ColumnPositionMappingStrategy<T>() {
        @Override
        public T populateNewBean(String[] line) throws CsvDataTypeMismatchException, CsvConstraintViolationException,
                CsvRequiredFieldEmptyException, CsvValidationException {
            Arrays.setAll(line, (i) -> line[i].trim());
            return super.populateNewBean(line);
        }
    };
}

如您所见,在填充 Bean 之前,每个字段/行都会被修剪。