java - 使用 Spring 在 Java 中进行批处理的输入文件中的多种模式

标签 java spring batch-processing spring-batch

美好的一天,

我在工作中提到了here

这是部分代码:

<bean id="flatFileTokenizer"   class="org.springframework.batch.item.file.transform.PrefixMatchingCompositeLineTokenizer">
    <property name="tokenizers">
        <map>
            <entry key="10" value-ref="recordType10" />
            <entry key="20" value-ref="recordType20" />
            <entry key="21" value-ref="recordType21" />
            [...]
        </map>
    </property>
</bean>

想问一下key代表什么? 10 , 20 , 21 指的是什么?

这是否意味着它将与我的输入文件匹配,即以 1020 等开头的第一行数据?

这是我自己的作品,以下是我的代码:

<beans:bean id="salaryDeductionLineTokenizer" class="org.springframework.batch.item.file.transform.PatternMatchingCompositeLineTokenizer">
        <beans:property name="tokenizers">
            <beans:map>
                <beans:entry key="01*" value-ref="header" />
                <beans:entry key="02*" value-ref="details" />
            </beans:map>
        </beans:property>
    </beans:bean>

    <beans:bean id="header" class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
        <beans:property name="names" value="headerRecordType,headerDate,headerAGBranchCode,headerTotalRecord,headerTotalAmount,headerAgencyName,headerFiller" />
        <beans:property name="columns" value="1-2, 3-8, 9-12, 13-17, 18-28, 29-48, 49-120" />
    </beans:bean>

    <beans:bean id="details" class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
        <beans:property name="names" value="recordType,department,payCenter,region,personelNo,ic,accountNumber,name,deductionAmount,deductionCode,filler" />
        <beans:property name="columns" value="1-2, 3-10, 11-14, 15-16, 17-24, 25-36, 37-56, 57-96, 97-105, 106-109, 110-120" />
    </beans:bean>

创建这个tokenizer的目的是从一个txt文件中读取数据,该文件由不同样式的数据行组成,第一行是标题,另一行是详细信息行。

以下是我的 txt 文件的示例数据: ojit_代码

我收到如下错误: 引起原因:java.lang.IllegalArgumentException:无法从 [headerRecordType、headerDate、headerAGranchCode、headerTotalRecord、headerTotalAmount、headerAgencyName、headerFiller] 访问列 [recordType]

尝试谷歌搜索但找不到解决方案。请指教。

*如果我的问题令人困惑,请通知我。 *

最佳答案

该配置定义了与精确模式匹配的行标记器列表。 请参阅下面 Spring Batch API 的解释本身:

A LineTokenizer implementation that stores a mapping of String patterns to delegate LineTokenizers. Each line tokenizied will be checked to see if it matches a pattern. If the line matches a key in the map of delegates, then the corresponding delegate LineTokenizer will be used. Patterns are sorted starting with the most specific, and the first match succeeds.

我上面说的是匹配精确的模式,因为每个键不包含任何特殊字符('*'或'?'),因此文件中的一行如果恰好是“10”或“20”,则将匹配“(作为字符串)。如果一行恰好“10”匹配,它将被移交给 LineTokenizer“recordType10”。

但是,我怀疑作者想要这个例子,因为在他的博客中有 another entry它描述了到 Spring Batch 2.1 的迁移,其中示例代码包含更有意义的“10*”和“20*”模式。

“10*”表示“从 10 开始”,“20*”表示“从 20 开始”。

关于java - 使用 Spring 在 Java 中进行批处理的输入文件中的多种模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22960263/

相关文章:

java - 如何为 maxmind geoip2 eclipse 添加依赖项

java - 如何将 Java 8 与 MS Access 连接?

java - StringRedisTemplate线程安全能力

java - Spring Boot 注释和导入在 Intellij IDE 上无法解析

java - 为每个新请求创建新的 java.sql.Connection

windows - 试图通过批处理文件阻止 RuntimeBroker.exe 使用过多的 CPU

java - 使用 java 将文件上传到 Amazon S3 失败 - sun.security.validator.ValidatorException

batch-file - 如何批量将文件名转换为小写并更新相应文件中的引用

hibernate - 有 hibernate 中批处理的示例吗?

java - 无法运行 eclipse,不断出现错误?