Comment personnalisé Spring Batch DelimitedLineTokenizer
J'ai deux types de fichiers à insérer dans la base de données.
Format : aa;bb;cc, aa;bb;cc;dd;ee
C'est mon FlatFileItemReader :
<bean name="readerContractToAddIntoPRV" class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="comments" value="#" />
<property name="linesToSkip" value="1" />
<property name="strict" value="false" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="fieldSetMapper">
<bean class="net.wl.batchs.fieldSetMapper.LineToCreateIntoPrvFieldSetMapper" />
</property>
<property name="lineTokenizer">
<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value=";"/>
<property name="names" value="aa,bb,cc,dd,ee" />
</bean>
</property>
</bean>
</property>
</bean>
Je veux une configuration qui fonctionne pour les deux types de fichiers.
Pour le moment, j'ai ceci :
org.springframework.lot.de l'élément.fichier.transformer.IncorrectTokenCountException:
Incorrect le nombre de jetons trouve dans le dossier: 3 effectif 5
Avez-vous des idées?
Merci.
Edit : Après correction :
<bean name="readerContractToAddIntoPRV" class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="comments" value="#" />
<property name="linesToSkip" value="1" />
<property name="strict" value="false" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper" p:lineTokenizer-ref="multilineFileTokenizer">
<property name="fieldSetMapper">
<bean class="net.wl.batchs.fieldSetMapper.LineToCreateIntoPrvFieldSetMapper" />
</property>
</bean>
</property>
</bean>
<bean id="multilineFileTokenizer" class="org.springframework.batch.item.file.transform.PatternMatchingCompositeLineTokenizer">
<property name="tokenizers">
<map>
<entry key="*;*;*;*;*" value-ref="NSCE_ICCID_MSISDN_LOGIN_PWD"/>
<entry key="*;*;*" value-ref="NSCE_ICCID_MSISDN"/>
<entry key="*" value-ref="headerDefault"/>
</map>
</property>
</bean>
<bean id="parentLineTokenizer" class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer" abstract="true">
<property name="delimiter" value=";"/>
</bean>
<bean id="NSCE_ICCID_MSISDN_LOGIN_PWD" parent="parentLineTokenizer">
<property name="names" value="nsce,iccid,msisdn,login,pwd" />
</bean>
<bean id="NSCE_ICCID_MSISDN" parent="parentLineTokenizer">
<property name="names" value="nsce,iccid,msisdn" />
</bean>
<bean id="headerDefault" parent="parentLineTokenizer">
<property name="names" value="nsce,iccid,msisdn" />
</bean>
OriginalL'auteur user2007861 | 2014-12-16
Vous devez vous connecter pour publier un commentaire.
La question n'est pas de votre générateur de jetons. Ce que vous aurez à faire est d'utiliser la
PatternMatchingCompositeLineMapper
(http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapper.html). Cela vous permettra de créer un modèle pour chaque type de ligne que vous avez et de les associer avec lesLineTokenizer
.Vous pouvez le voir, cette
LineMapper
en action dans nos échantillons ici: https://github.com/spring-projects/spring-batch/blob/master/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xmlIl y a un certain nombre de façons différentes de gérer cela en fonction de la complexité que vous voulez obtenir. Le plus simple serait de mettre en place votre propre équivalent de la
PatternMatchingCompositeLineMapper
qui ne fait l'évaluation une fois.Pour votre information, j'utilise le HeaderBasedDelimitedLineTokenizer classe. (Exactement ce que je cherchais). Je l'ai trouvé ici:jira.printemps.io/parcourir/LOT-1979
OriginalL'auteur Michael Minella