美好的一天,
我在工作中提到了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
指的是什么?
这是否意味着它将与我的输入文件匹配,即以 10
、 20
等开头的第一行数据?
这是我自己的作品,以下是我的代码:
<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/