[英]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.