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

How to parse CSV(with values containing commas) with Spring Batch

我想像这样解析一行:

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

进入这些代币:

A | aa,bb | (empty string) | aa

FileItemReader 的定义是什么样的?我想我需要自己的 DelimitedLineTokenizer?

谢谢

检查这个例子http://www.mkyong.com/spring-batch/spring-batch-hello-world-example/

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

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

甚至我也遇到过同样的情况,其中一个包含逗号的文本被滑到了一个新的单元格中。我更改了 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>

还创建了自定义 class(即 CustomDelimitedLineAggregator.java),如下所示:-

包 com;

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

public class 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方法中,每一行的完整数据即将到来,如果任何行包含逗号,它将把整行放在里面(即双引号)“我的包含逗号的完整行数据”因此,即使其中包含逗号,整行也将位于一行中。