如何使用Spring Batch解析CSV(包含逗号的值)

时间:2015-01-16 17:41:43

标签: spring parsing csv spring-batch

我想解析这样的一行:

  

" A"," aa,bb" ,," aa"

进入这些代币:

  

A | aa,bb | (空字符串)| AA

FileItemReader定义如何?我想我需要自己的DelimitedLineTokenizer?

由于

3 个答案:

答案 0 :(得分:1)

请查看此示例http://www.mkyong.com/spring-batch/spring-batch-hello-world-example/

如果逗号将成为分隔符,则无需创建自己的DelimitedLineTokenizer。 您可以使用" org.springframework.batch.item.file.transform.DelimitedLineTokenizer"

答案 1 :(得分:1)

DelimitedLineTokenizer应该可以解析逗号或管道。如果您正在考虑读取以逗号分隔并转换为管道分隔的文件,则需要丰富您的项目(在处理器中),然后保留它。

答案 2 :(得分:0)

即使在相同的情况下,一个包含逗号的文本也会滑到新的单元格上。我更改了XML并添加了CustomDelimitedLineAggregator。

例如:)我的XML将包含以下代码:-

        

    <property name="lineAggregator">
        <bean
            class="com.CustomDelimitedLineAggregator">
            <property name="delimiter" value="|" />
            <property name="fieldExtractor">
                <bean
                    class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                    <property name="names"
                        value="entityHashKey,entityLocationClli,entityLocationName,entityLocationType,entitySCISCode,entityStateCode,entityCountryCode,entityRegion" />
                </bean>
            </property>
        </bean>
    </property>
</bean>

还创建了如下的自定义类(即CustomDelimitedLineAggregator.java):-

package com;

导入org.springframework.batch.item.file.transform.ExtractorLineAggregator; 导入org.springframework.util.StringUtils;

公共类CustomDelimitedLineAggregator扩展了ExtractorLineAggregator {     私有字符串定界符;

public CustomDelimitedLineAggregator() {
    this.delimiter = ",";
}

public void setDelimiter(String delimiter) {
    this.delimiter = delimiter;
}

@Override
public String doAggregate(Object[] fields) {

    String arrregateVal = StringUtils.arrayToDelimitedString(fields, this.delimiter);
    if(null != arrregateVal && arrregateVal.contains(","))
    {
        arrregateVal = "\""+arrregateVal+"\"";
    }
    return arrregateVal;
}

}

doAggregate方法中,每一行的完整数据都将到来,如果任何行包含逗号,它将把整行放在里面(即双引号)“我的包含逗号的完整行数据”因此即使其中包含逗号,整行也将放在一行中。