Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中处理/读取.BAI2文件_Java_Spring Batch_Bai2 - Fatal编程技术网

在java中处理/读取.BAI2文件

在java中处理/读取.BAI2文件,java,spring-batch,bai2,Java,Spring Batch,Bai2,我正在使用java读取.BAI2文件和处理事务记录。我一直在探索各种选项,如使用普通java文件IO读取和解析.BAI2文件,使用spring批处理等。但我发现.BAI2文件结构相当复杂,无法正常工作。 只是想知道是否有任何标准工具或方法可以使用java读取.BAI2文件。如果可以用弹簧批来实现。 提前谢谢 .BAI2是银行使用的行业标准格式。以下是一个被截断的示例:- 01,021000021,CST_USER,110520,1610,1627,,,2/ 02,CST_USER,089900

我正在使用java读取.BAI2文件和处理事务记录。我一直在探索各种选项,如使用普通java文件IO读取和解析.BAI2文件,使用spring批处理等。但我发现.BAI2文件结构相当复杂,无法正常工作。 只是想知道是否有任何标准工具或方法可以使用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条记录之后。记录是分组的,02可以有多个03,03可以有多个16,88也可以有多个

Spring批处理具有读取复杂文件的能力。唯一的问题是我们必须编写自己的读取器来处理复杂的文件。任何具有特定模式的文件,我们都可以通过SpringBatch读取

这是与您的文件类似的文件格式

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
自定义文件读取器

    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);
}
}
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;
}
}
import org.springframework.batch.item.file.mapping.FieldSetMapper;
导入org.springframework.batch.item.file.transform.FieldSet;
导入org.springframework.validation.BindException;
公共类CustomerFieldSetMapper实现FieldSetMapper{
公共客户映射字段集(字段集字段集)引发BindException{
客户=新客户();
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”));
退货客户;
}
}

谢谢您的回复。我在上面添加了.BAI2文件示例。对于如何使用spring批处理文件,您有什么建议吗?任何特定类型的读者,行映射器等。我们完全可以使用自定义ItemReader处理此文件,通过自定义ItemReader我们可以将记录聚合为单个记录。我将给您一个代码片段,用于读取这些类型的复杂文件。但我可以给出示例程序,仅凭此想法,您就知道如何读取.BAI2文件。如果有任何问题,请随时联系我们评论你好,巴吉,非常感谢你的示例代码和你的时间。非常感谢。示例代码只需稍加修改即可工作。不过,我很少有疑问;1.假设“CUST”和“TRANS”记录具有可变字段/长度,是否可以根据记录长度使用不同的行标记器和映射器?因为在.BAI2格式中,相同类型的记录可以有不同数量的字段。2.对于.BAI2文件格式,共有7种类型的记录。是否可以像您共享的示例中那样使用单个itemReader来处理所有这7种记录类型。对于以相同标记开始的点1记录,我认为不能有不同的字段集映射器。但是我们可以通过在自定义字段集映射器中处理记录的字段长度来解决此问题。对于第2点。是的。我们可以在一个阅读器中处理所有类型的记录,正如我分享的例子。我在我的项目中使用这段代码没有任何麻烦。
<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>
Warren Q. Darrow has 1 transactions.
Ann V. Gates has no transactions.
Erica I. Jobs has 5 transactions.
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;
}
}