簡體   English   中英

修剪 OpenCSV 中的前導和尾隨空格

[英]Trim leading and trailing spaces in OpenCSV

我正在使用 OpenCSV 的CSVReader從文件中讀取一些逗號分隔的值。 我不確定如何修剪前導和尾隨空格。 當然,我可以做String.trim()但最好不要這樣做。 文檔中沒有指定這樣的選項。

你可以切換到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;
    }
}

如果您使用 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 之前,每個字段/行都會被修剪。

使用 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;
    }
}

我最終擴展了 CsvParser 來做到這一點

CSVParser parser = new CSVParser() {
    @Override
    protected String[] parseLine(String nextLine, boolean multi) throws IOException {
        String[] line = super.parseLine(nextLine, multi);
        Arrays.setAll(line, i -> line[i].trim());
        return line;
    }
};
MappingStrategy<R> mappingStrategy = new HeaderColumnNameMappingStrategy<>();
mappingStrategy.setType(rowType);
Reader reader = new FileReader('c:/path/to/file.csv');
CSVReader csvReader = new CSVReaderBuilder(reader).withCSVParser(csvParser).build();
CsvToBean<R> csvToBean = new CsvToBeanBuilder<R>(csvReader).withMappingStrategy(mappingStrategy).build();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM