2016-06-28 17 views
-1

このフラットファイルは、その中にあるさまざまなフィールドを取得するために解析する必要があります。たとえば、位置0〜2はヘッダーリテラル、位置3〜10は名前などです。 私はこのことについてどのように動くかを考え出すのに苦労しています。この固定長ファイルを解析するために使用できるものはSpring Batchにありますか?
LMSそうでサプライヤコードであり、0000001140658760レシート番号、
H1リテラル行であるので、上記の形式でSpringまたはJava 8を使用して固定フォーマットのフラットファイルを解析する

H10000001140658760000  16778816471A   422    
I10000001140658760IT2016060310850028010700030719564-010    L00000072 

: サンプルフラットファイルを以下に示します。 Iは2位に

  • 位置0のような様々な分野にそれらをマッピングする必要
    は、位置18にリテラル、
  • 位置3で28を配置する
  • 位置18は、サプライヤコードであり、受付番号です。

助言してください。

私はSpringバッチインテグレーションでBeanIOを使用しようとしましたが、リーダーを作成しようとしているときにエラーが発生しています。
org.springframework.batch.item.ItemStreamExceptionが発生しました:リーダーの初期化に失敗しました。スタックトレース

<beanio xmlns="http://www.beanio.org/2012/03" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.beanio.org/2012/03 http://www.beanio.org/2012/03/mapping.xsd"> 

<stream name="file" format="fixedlength" minOccurs="0" maxOccurs="unbounded"> 
<record name="employee" class="Employee" order="1"> 
</record> 
<record name="company" class="Company" order="2"> 
</record> 
</stream> 
</beanio> 
ここ

です:

org.springframework.batch.item.ItemStreamException: Failed to initialize the reader 
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:147) 
at com.gateway.fileloader.fileprocessor.ArchiveFileProcessor.createBeanIOFlatFileItemReader(ArchiveFileProcessor.java:211) 
at com.gateway.fileloader.fileprocessor.ArchiveFileProcessor.doProcess(ArchiveFileProcessor.java:84) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:113) 
at org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:129) 
at org.springframework.expression.spel.ast.MethodReference.access$000(MethodReference.java:49) 
at org.springframework.expression.spel.ast.MethodReference$MethodValueRef.getValue(MethodReference.java:347) 
at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:88) 
at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:131) 
at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:330) 
at org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:166) 
at org.springframework.integration.util.MessagingMethodInvokerHelper.processInternal(MessagingMethodInvokerHelper.java:317) 
at org.springframework.integration.util.MessagingMethodInvokerHelper.process(MessagingMethodInvokerHelper.java:155) 
at org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:93) 
at org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:89) 
at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:99) 
at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) 
at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:147) 
at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:120) 
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:77) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:442) 
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:392) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) 
at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) 
at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105) 
at org.springframework.integration.endpoint.SourcePollingChannelAdapter.handleMessage(SourcePollingChannelAdapter.java:161) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:251) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint.access$000(AbstractPollingEndpoint.java:57) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:176) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:173) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:330) 
at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:55) 
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) 
at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:51) 
at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:324) 
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) 
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) 
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

Caused by: java.lang.IllegalArgumentException: No stream mapping configured for name 'fileDummy' 
at org.beanio.internal.DefaultStreamFactory.getStream(DefaultStreamFactory.java:129) 
at org.beanio.internal.DefaultStreamFactory.createReader(DefaultStreamFactory.java:70) 
at org.beanio.spring.BeanIOFlatFileItemReader.doOpen(BeanIOFlatFileItemReader.java:129) 
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:144) 
... 48 more 
+4

[BeanIO](http://beanio.org/)の使用をお勧めします。 –

+0

'http://docs.spring.io/spring-batch/apidocs/org/springframework/batch/item/file/transform/FixedLengthTokenizer.html'をご覧ください。 –

+1

@LucaBassoRicci悪いリンク、余分な終了引用符があります。それ以外は –

答えて

2

あなたはそれを行うことができますorg.beanio.spring.BeanIOFlatFileItemReader

によって下
public BeanIOFlatFileItemReader<String> createBeanIOFlatFileItemReader(File file) throws Exception { 
    BeanIOFlatFileItemReader<String> reader = new BeanIOFlatFileItemReader<>(); 

    reader.setStreamFactory(StreamFactory.newInstance()); 
    reader.setResource(new FileSystemResource(file)); 
    reader.setStreamMapping(new ClassPathResource("mapping.xml")); 
    reader.setStreamName("file");//this name shud be same as the name of the stream in the mapping.xml 
    reader.afterPropertiesSet();// Adding this solved the issue! 
    reader.open(new ExecutionContext()); 
    return reader; 
} 

は、私が使用しているマッピングファイルです: 以下は私のコードです

batch-context.xml

<bean id="fixedWidthFileReader" class="org.beanio.spring.BeanIOFlatFileItemReader" scope="step"> 
    <property name="streamMapping" value="classpath:META-INF/mapping.xml"/> 
    <property name="streamName" value="flatFileStream" /> 
    <property name="resource" value="resource/inputFile"/></bean> 

mapping.xml

<stream name="flatFileStream" format="fixedlength"> 
<record name="flatFileContents" class="com.test.YourPojo" order="1"> 
    <field name="header" length="2" /> 
    <field name="name" length="15" /> 
    <field name="supplierCode" length="10" /> 
</record> 

com.test.YourPojoはドメインモデルです。

注:mapping.xmlの長さは、要件によって異なります。

+1

の読者は間違いなく正しい読者ですが、なぜXMLを採用するのでしょうか?最近、私はJavaConfigを使用したいと思っていました –

+0

確かに、例えば、私はxml設定を行っただけです。 – Jay

+0

@Jay Spring BatchでBeanIOを使用しようとしましたが、上記のエラーが発生しました。何かご意見は? – user5758361

関連する問題