2014-12-03 231 views
1

我正在读取.BAI2文件并使用java处理事务记录。我一直在探索各种选项,如阅读和解析使用纯Java文件IO,使用弹簧批处理等.BAI2文件等。但我发现.BAI2文件结构相当复杂,无法使其正常工作。 只是想知道的意见/想法,如果有任何标准的工具或方法来读取.BAI2文件使用Java。如果可以使用弹簧批次来实现。 在此先感谢。在java中处理/读取.BAI2文件

.BAI2是银行使用的行业标准格式。下面是一个截断的例子: -

01,021000021,CST_USER,110520,1610,1627,,,2/ 
02,CST_USER,089900137,1,110509,1610,,2/ 
03,000000370053368,USD,010,782711622,,,015,7620008 12,,,040,760753198,,/ 
88,043,760000052,,,045,760010026,,,050,760000040,, ,055,760000045,,/ 
88,057,254419300,,,063,2000786,,,072,743172,,,073, 10000,,,074,1257614,,/ 
88,075,0,,,100,272765847,4,,140,288225,1,,170,1932 141,1,,230,270542100,1,/ 
88,390,3381,1,,400,293476657,478,,470,39057357,477 ,,530,254419300,1,/ 
16,165,288225,S,288225,0,0,1296942968TC,/ 
88,ORIG CO NAME= CABINET,ORIG ID=KAGIRO,DESC DATE=110509,ENTRY DESCR=G 
88,IRO CRED,ENTRY CLASS=CCD,TRACE NO=021000026942968,ENTRY DATE=110509,IND ID N 
88,O=KCAGIRO,IND NAME= CABINET 
16,175,1932141,S,123432,551095,1257614,5070689876, ,/ 
16,249,270542100,S,270542100,0,0,1262000098XN,31Y9 957018126/ 
88,REMARK=RETURN OF PRINCIPAL - END-OF-DAY SWEEP REPURCHASE AGREEMENT. 

88条记录是可选的附加的继续记录,可以跟在03或16条记录。记录是分组的,你可以有多个03和02以及多个16和03以及多个88。

回答

1

Spring批处理能够读取复杂文件。唯一的事情是我们必须编写我们自己的读者来处理复杂的文件。任何具有特定模式的文件我们都可以通过spring批处理来读取它。

这就像你的文件

CUST,Warren,Q,Darrow,8272 4th Street,New York,IL,76091 
TRANS,1165965,2011-01-22 00:13:29,51.43 
CUST,Ann,V,Gates,9247 Infinite Loop Drive,Hollywood,NE,37612 
CUST,Erica,I,Jobs,8875 Farnam Street,Aurora,IL,36314 
TRANS,8116369,2011-01-21 20:40:52,-14.83 
TRANS,8116369,2011-01-21 15:50:17,-45.45 
TRANS,8116369,2011-01-21 16:52:46,-74.6 
TRANS,8116369,2011-01-22 13:51:05,48.55 
TRANS,8116369,2011-01-21 16:51:59,98.53 

定制的FileReader

import Java.util.ArrayList; 
import org.springframework.batch.item.ExecutionContext; 
import org.springframework.batch.item.ItemStreamException; 
import org.springframework.batch.item.ItemStreamReader; 
import org.springframework.batch.item.ParseException; 
import org.springframework.batch.item.UnexpectedInputException; 
public class CustomerFileReader implements ItemStreamReader<Object> { 
private Object curItem = null; 
private ItemStreamReader<Object> delegate; 
public Object read() throws Exception { 
if(curItem == null) { 
curItem = (Customer) delegate.read(); 
} 
Customer item = (Customer) curItem; 
curItem = null; 
if(item != null) { 
item.setTransactions(new ArrayList<Transaction>()); 
while(peek() instanceof Transaction) { 
curItem = null; 
} 
} 
return item; 
} 
public Object peek() throws Exception, UnexpectedInputException, 
ParseException { 
if (curItem == null) { 
curItem = delegate.read(); 
} 
return curItem; 
} 
public void setDelegate(ItemStreamReader<Object> delegate) { 
this.delegate = delegate; 
} 
public void close() throws ItemStreamException { 
delegate.close(); 
} 
public void open(ExecutionContext arg0) throws ItemStreamException { 
delegate.open(arg0); 
} 
public void update(ExecutionContext arg0) throws ItemStreamException { 
delegate.update(arg0); 
} 
} 

配置

<beans:bean id="customerFile" 
class="org.springframework.core.io.FileSystemResyource" scope="step"> 
<beans:constructor-arg value="#{jobParameters[customerFile]}"/> 
</beans:bean> 
<beans:bean id="customerFileReader" 
class="com.apress.springbatch.chapter7.CustomerFileReader"> 
<beans:property name="delegate" ref="trueCustomerFileReader"/> 
</beans:bean> 
<beans:bean id="trueCustomerFileReader" 
class="org.springframework.batch.item.file.FlatFileItemReader"> 
<beans:property name="resource" ref="customerFile" /> 
<beans:property name="lineMapper"> 
<beans:bean class="org.springframework.batch.item.file.mapping. 
PatternMatchingCompositeLineMapper"> 
<beans:property name="tokenizers"> 
<beans:map> 
<beans:entry key="CUST*" value-ref="customerLineTokenizer"/> 
<beans:entry key="TRANS*" value-ref="transactionLineTokenizer"/> 
</beans:map> 
</beans:property> 
<beans:property name="fieldSetMappers"> 
<beans:map> 
<beans:entry key="CUST*" value-ref="customerFieldSetMapper"/> 
<beans:entry key="TRANS*" value-ref="transactionFieldSetMapper"/> 
</beans:map> 
</beans:property> 
</beans:bean> 
</beans:property> 
</beans:bean> 
<beans:bean id="customerLineTokenizer" 
class="org.springframework.batch.item.file.transform. 
DelimitedLineTokenizer"> 
<beans:property name="names" value="prefix,firstName,middleInitial, 
lastName,address,city,state,zip"/> 
<beans:property name="delimiter" value=","/> 
</beans:bean> 
<beans:bean id="transactionLineTokenizer" 
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
<beans:property name="names" 
value="prefix,accountNumber,transactionDate,amount"/> 
<beans:property name="delimiter" value=","/> 
</beans:bean> 
<beans:bean id="customerFieldSetMapper" 
class="org.springframework.batch.item.file.mapping. 
BeanWrapperFieldSetMapper"> 
<beans:property name="prototypeBeanName" value="customer"/> 
</beans:bean> 
<beans:bean id="transactionFieldSetMapper" 
class="com.apress.springbatch.chapter7.TransactionFieldSetMapper"/> 
<beans:bean id="customer" class="com.apress.springbatch.chapter7.Customer" 
scope="prototype"/> 

输出作家

<beans:bean id="outputFile" 
class="org.springframework.core.io.FileSystemResyource" scope="step"> 
<beans:constructor-arg value="#{jobParameters[outputFile]}"/> 
</beans:bean> 
<beans:bean id="outputWriter" 
class="org.springframework.batch.item.file.FlatFileItemWriter"> 
<beans:property name="resource" ref="outputFile" /> 
<beans:property name="lineAggregator"> 
<beans:bean class="org.springframework.batch.item.file.transform. 
PassThroughLineAggregator"/> 
</beans:property> 
</beans:bean> 
文件格式0

输出将是

Warren Q. Darrow has 1 transactions. 
Ann V. Gates has no transactions. 
Erica I. Jobs has 5 transactions. 

CustomerFieldSetMapper

import org.springframework.batch.item.file.mapping.FieldSetMapper; 
import org.springframework.batch.item.file.transform.FieldSet; 
import org.springframework.validation.BindException; 
public class CustomerFieldSetMapper implements FieldSetMapper<Customer> { 
public Customer mapFieldSet(FieldSet fieldSet) throws BindException { 
Customer customer = new Customer(); 
customer.setAddress(fieldSet.readString("addressNumber") + 
" " + fieldSet.readString("street")); 
customer.setCity(fieldSet.readString("city")); 
customer.setFirstName(fieldSet.readString("firstName")); 
customer.setLastName(fieldSet.readString("lastName")); 
customer.setMiddleInitial(fieldSet.readString("middleInitial")); 
customer.setState(fieldSet.readString("state")); 
customer.setZip(fieldSet.readString("zip")); 
return customer; 
} 
} 
+0

感谢您的答复。上面添加了.BAI2文件示例。你有什么建议,我应该如何使用spring-batch来处理文件?任何特定类型的读者,行映射器等。 – ivish 2014-12-04 14:33:42

+0

绝对我们可以使用自定义ItemReader来处理这个文件,通过它我们可以将记录聚合成单个记录。我会给你一个代码片段,用于读取这些类型的复杂文件。但我可以给范例程序只通过这个想法,你来了一个想法如何阅读.BAI2 file.if任何问题随时发表评论 – 2014-12-05 06:18:27

+0

你好巴吉,非常感谢您的示例代码和您的时间。非常感谢。示例代码稍作修改。我虽然有几个疑问, 1.假设'CUST'和'TRANS'记录具有可变字段/长度,是否可以根据记录长度使用不同的行标记器和映射器?因为在.BAI2格式中,相同类型的记录可以具有可变数量的字段。 2.如果.BAI2文件格式共有7种类型的记录。是否有可能使用单个itemReader处理所有这7种记录类型,如同您共享的示例一样。 – ivish 2014-12-05 14:54:41