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