java - univocity - 如何从选定的字符中解析字符串
问题描述
我有下一个 .csv 文件:
tt0102057, 6, 2010-06-19, 钩
tt0102059, 7 ,2013-06-23, 热点!
tt0102070, 5, 2010-02-10, 哈德逊鹰
我需要将第一列的值解析为 int 值,而不是字符串。所以我需要跳过前两个符号并将其余的作为整数。
如何在解析阶段使用单义解析器来做到这一点?
该代码有效并将数据保存到bean:
BeanListProcessor<univMovie> rowProcessor = new BeanListProcessor<univMovie>(univMovie.class);
CsvParserSettings settings = new CsvParserSettings();
settings.getFormat().setLineSeparator("\n");
settings.setProcessor(rowProcessor);
settings.setHeaderExtractionEnabled(true);
CsvParser parser = new CsvParser(settings);
parser.parse(new FileReader("src/main/resources/movie.csv"));
List<univMovie> beans = rowProcessor.getBeans();
解决方案
你有很多选择:
最简单的方法是,在您的univMovie
类上,在@Replace
将接收该数据的字段上方添加一个注释:
@Parsed
@Replace(expression = "tt", replacement = "")
int yourField;
如果您的字段可能比较棘手并且正则表达式不是一个简单/清晰的解决方案,您可以将@Parsed
注释放在将为您设置该字段的方法上:
@Parsed
void setYourField(String value){
String cleanValue = someMethodToCleanYourValue(value);
yourField = Integer.parseInt(cleanValue);
}
您还可以告诉处理器转换多个字段:
rowProcessor.convertIndexes(Conversions.replace("tt", ""))
.set(0); //one or more indexes
希望这可以帮助
推荐阅读
- python - TypeError 的迭代错误:'_io.TextIOWrapper' 对象不可调用
- laravel - 如何在 laravel 中创建中间件
- python - 是否可以在设备上加载 .gpx 轨道以使用 appium 测试跟踪器?
- angular - 根据其他输入字段更新输入字段
- node.js - IBM Openwhisk,无法提取路由参数
- spring-boot - 如何在 Spring Boot 中从 Azure SAML 2.0 应用程序获取角色或组
- jdbc - Teradata Fastload Utility 的速度应该是多少?
- angular - 一次性绑定指令不适用于 Angular 4
- go - 如何获取详细的构建日志,所有使用的包都在 GOPATH 和“go module”模式下?
- r - 当我使用 tidyverse 中的“传播”功能时,RStudio 继续崩溃