【问题标题】:How to parse CSV(with values containing commas) with Spring Batch如何使用 Spring Batch 解析 CSV(值包含逗号)
【发布时间】:2015-01-16 17:41:42
【问题描述】:

我想解析这样的一行:

“A”、“aa,bb”、“aa”

到这些令牌中:

一个 | aa,bb | (空字符串) |啊

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

谢谢

【问题讨论】:

  • 我认为默认的 DelimitedLineTokenizer 无需修改即可正常工作。你试过了吗?它给了你哪些错误?还要检查stackoverflow.com/questions/17998354/…
  • 出于某种原因,我认为它不起作用。现在刚试了一下,效果很好。感谢您的帮助!

标签: spring parsing csv spring-batch


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是真的,因为 DelimitedLineTokenizer 的 quoteCharacter 属性设置为引号 ("),所以它开箱即用。谢谢!
    【解决方案3】:

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

    eg:) 我的 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),如下所示:-

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-04
      相关资源
      最近更新 更多