Обработка / чтение файлов .BAI2 в java

Я работаю над чтением файлов .BAI2 и обработкой записей транзакций с использованием java. Я изучаю различные варианты, такие как чтение и анализ файла .BAI2 с использованием простого ввода-вывода java-файла, с использованием пакета Spring и т. Д. Но я нахожу файловую структуру .BAI2 довольно сложной и не могу заставить ее работать правильно. Просто хотел узнать мнения / мысли, есть ли какие-либо стандартные инструменты или способы чтения файлов .BAI2 с использованием java. И если этого можно добиться с помощью пружинного замеса. Заранее спасибо.

.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.


person ivish    schedule 03.12.2014    source источник


Ответы (1)


Пакет Spring имеет возможность чтения сложных файлов. единственное, что мы должны написать наших собственных читателей для обработки сложных файлов. любой файл, имеющий определенный шаблон, мы можем прочитать его через Spring Batch.

это формат файла, подобный вашему файлу

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>

выход будет

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;
}
}
person Baji Shaik    schedule 04.12.2014
comment
Спасибо за ваш ответ. Я добавил пример файла .BAI2 выше. Есть ли у вас какие-либо предложения о том, как использовать spring -batch для обработки файла? Любые определенные типы считывателей, линейных картографов и т. Д. - person ivish; 04.12.2014
comment
абсолютно мы можем обработать этот файл с помощью настраиваемого ItemReader, с помощью которого мы можем объединить записи в одну запись. Я предоставлю вам фрагмент кода, который используется для чтения этого типа сложного файла. но я могу привести пример программы только по той идее, которую вы пришла в голову идея как читать файл .BAI2. если есть вопросы не стесняйтесь комментировать - person Baji Shaik; 05.12.2014
comment
Здравствуйте, Баджи, большое спасибо за образец кода и ваше время. Это очень ценно. Примерный код работает с небольшими изменениями. Хотя у меня мало вопросов; 1. Предположим, что если записи CUST и TRANS имеют переменные поля / длины, можно ли использовать разные токенизаторы и преобразователи строк в зависимости от длины записи? Поскольку в формате .BAI2 записи одного типа могут иметь переменное количество полей. 2. В случае файла формата .BAI2 всего существует 7 типов записей. Можно ли обработать все эти 7 типов записей с помощью одного itemReader, как в приведенном вами примере. - person ivish; 05.12.2014
comment
для записи точки 1, начинающейся с одного и того же токена, я думаю, не может быть разных сопоставителей набора полей, но мы можем решить эту проблему, позаботившись о длине поля записи в настраиваемом сопоставителе набора полей. для пункта 2. да. мы можем обрабатывать все типы записей в одном считывателе, поскольку я поделился примером. я без проблем использую этот код в своем проекте. - person Baji Shaik; 05.12.2014