13

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

4

3 回答 3

4

可以切换SuperCSV吗?它可以选择忽略其CsvPreference.Builder. 这是一个非常优秀的图书馆,IMO。如果该偏好不能满足您的需求,您始终可以扩展 Tokenizer 类并覆盖readColumns。否则,它看起来OpenCSV不是很精细,需要您扩展CSVReader和覆盖readNext. 这可能有效:

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;
    }
}
于 2014-03-20T16:00:06.637 回答
3

如果您正在使用 bean 映射和 OpenCSV,我个人更喜欢扩展 MappingStrategy,因为它处理对其相关字段的最终值分配。想象一下您的字段是制表符分隔的。那么你可能很难扩展 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 之前修剪每个字段/行。

于 2020-07-15T23:59:38.680 回答
1

使用 ngreen 的想法,我想出了以下工作解决方案:

public class CSVReaderExtended extends CSVReader {

    private static final String EXP_ALPHA_AND_DIGITS = "[^a-zA-Z0-9]+";

    public CSVReaderExtended(Reader reader) {
        super(reader);
    }

    @Override
    public String[] readNext() throws IOException {
        String[] result = super.readNext();
        if (result == null)
            return null;

        for (int index = 0; index < result.length; index++) {
            result[index] = result[index].replaceAll(EXP_ALPHA_AND_DIGITS, "");
        }
        return result;
    }
}
于 2018-01-09T10:48:28.053 回答