Java 对Spring批处理使用Univocity解析器
我正在尝试在SpringBatch中使用Univocity解析器。我面临的问题是如何整合它们。Java 对Spring批处理使用Univocity解析器,java,csv,parsing,spring-batch,univocity,Java,Csv,Parsing,Spring Batch,Univocity,我正在尝试在SpringBatch中使用Univocity解析器。我面临的问题是如何整合它们。 Spring批处理区块步骤遵循给定文件每行的流程: 我需要在内部使用Univocity。它对输入文件(即.CSV文件)的每一行执行read()方法。我所做的唯一一件事就是使用BeanListProcessor直接读取项目并将其转换为Java对象,返回解析bean的列表,但我不想一次加载所有记录,以避免OutOfMemory异常。我没有找到任何能帮助我的东西。 我曾尝试使用answer作为示例,
Spring批处理区块步骤遵循给定文件每行的流程:
我需要在内部使用Univocity。它对输入文件(即.CSV文件)的每一行执行
read()
方法。我所做的唯一一件事就是使用BeanListProcessor
直接读取项目并将其转换为Java对象,返回解析bean的列表
,但我不想一次加载所有记录,以避免OutOfMemory
异常。我没有找到任何能帮助我的东西。
我曾尝试使用answer作为示例,但无法找出每次返回一个项目的方法
@Override
public Address read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
CsvParserSettings parserSettings = new CsvParserSettings();
//settings
CsvRoutines routines = new CsvRoutines(parserSettings);
for (Address address : routines.iterate(Address.class, input, "UTF-8")) {
/*
*here I need to return only the current object,
*the return of this method will be passed as an argument to a processor
*the next time this method is called it has to return the next one
*Could not figure out how to control what is the current.
*/
return ???:
}
return ???;
}
我如何在ItemReader中使用Univocity一次读取一行,仍然使用BeanProcessor将我的行自动解析为Java对象?嗨,我是库的作者<代码>例程。迭代(Address.class,输入,“UTF-8”)将返回一个
Iterable
。您可以从中获得一个迭代器
,并将该迭代器
保存在内存中
每次需要读取下一个地址时,只需调用迭代器.next()
我认为你的方法应该写为:
private Iterator<Address> iterator;
@Override
public Address read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if(iterator == null){
CsvParserSettings parserSettings = new CsvParserSettings();
//settings
CsvRoutines routines = new CsvRoutines(parserSettings);
iterator = routines.iterate(Address.class, input, "UTF-8")).iterator();
}
if(iterator.hasNext()){
return iterator.next();
} else {
iterator = null;
}
return null;
}
专用迭代器;
@凌驾
public Address read()引发异常、UnexpectedInputException、ParseException、NonTransientResourceException{
if(迭代器==null){
CsvParserSettings parserSettings=新的CsvParserSettings();
//背景
CsvRoutines例程=新的CsvRoutines(parserSettings);
迭代器=例程。迭代器(Address.class,输入,“UTF-8”)。迭代器();
}
if(iterator.hasNext()){
返回iterator.next();
}否则{
迭代器=null;
}
返回null;
}
希望这有帮助。嗨,我是lib的作者<代码>例程。迭代(Address.class,输入,“UTF-8”)
将返回一个Iterable
。您可以从中获得一个迭代器
,并将该迭代器
保存在内存中
每次需要读取下一个地址时,只需调用迭代器.next()
我认为你的方法应该写为:
private Iterator<Address> iterator;
@Override
public Address read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
if(iterator == null){
CsvParserSettings parserSettings = new CsvParserSettings();
//settings
CsvRoutines routines = new CsvRoutines(parserSettings);
iterator = routines.iterate(Address.class, input, "UTF-8")).iterator();
}
if(iterator.hasNext()){
return iterator.next();
} else {
iterator = null;
}
return null;
}
专用迭代器;
@凌驾
public Address read()引发异常、UnexpectedInputException、ParseException、NonTransientResourceException{
if(迭代器==null){
CsvParserSettings parserSettings=新的CsvParserSettings();
//背景
CsvRoutines例程=新的CsvRoutines(parserSettings);
迭代器=例程。迭代器(Address.class,输入,“UTF-8”)。迭代器();
}
if(iterator.hasNext()){
返回iterator.next();
}否则{
迭代器=null;
}
返回null;
}
希望这有帮助。谢谢您的回答!但是我怎样才能把它添加到一个读者身上呢?当方法read()
执行时,处理器一次返回每一行(如所讨论的图像)?如果我使用您发布的代码,它将在返回之前遍历所有te对象,或者它将始终返回第一个。我已更新了我的问题,以说明我尝试了什么。谢谢您的回答!但是我怎样才能把它添加到一个读者身上呢?当方法read()
执行时,处理器一次返回每一行(如所讨论的图像)?如果我使用您发布的代码,它将在返回之前遍历所有te对象,或者总是返回第一个。我已经更新了我的问题,以说明我尝试了什么。