美好的一天,
我在工作中指的是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文件的示例数据:
0120140310700000500000030000AgencyA Filler1
02PTJ ABCD00123456788912190860771234567890 Chong Jun Xian
02KLM ABCE00123456798912190860781234567894 Chong Jun Xian
02KLN ABCF0012345680891219086081108187066968 Chong Jun Cian
我收到的错误如下: 引起:java.lang.IllegalArgumentException:无法从[headerRecordType,headerDate,headerAGBranchCode,headerTotalRecord,headerTotalAmount,headerAgencyName,headerFiller]
访问列[recordType]尝试谷歌搜索,但无法找到解决方案。请建议。
*如果我的问题令人困惑,请通知我。 *
答案 0 :(得分:1)
这条配置定义了一个与精确模式匹配的行标记器列表。 请参阅以下Spring Batch API本身的解释:
一个LineTokenizer实现,它存储String模式的映射以委托LineTokenizer。将检查每一行标记符号以查看它是否与模式匹配。如果该行与代理映射中的键匹配,则将使用相应的委托LineTokenizer。模式从最具体的开始排序,第一个匹配成功。
我上面说的是匹配确切的模式,因为每个键都不包含任何特殊字符(&#39; *&#39;或&#39;?&#39;),所以在一个文件将匹配,如果它正是&#34; 10&#34;或&#34; 20&#34; (作为字符串)。如果一条线正是&#34; 10&#34;匹配它将被移交给LineTokenizer&#34; recordType10&#34;。
但是,我怀疑作者是否想要这个例子,因为在他的博客中有another entry描述了向Spring Batch 2.1的迁移,其中示例代码包含模式为&#34; 10 *&#34;和&#34; 20 *&#34;这更有意义。
&#34; 10 *&#34;意味着从10&#39;开始,&#34; 20 *&#34;意味着从20&#39开始。
答案 1 :(得分:0)
请在Spring Forum
解决方案:
在
处尝试不使用空格names
和columns