Java 对Spring批处理使用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作为示例,

我正在尝试在SpringBatch中使用Univocity解析器。我面临的问题是如何整合它们。

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对象,或者总是返回第一个。我已经更新了我的问题,以说明我尝试了什么。