2017-08-04 2 views
0

J'ai un fichier CSV qui n'a pas un nombre fixe de colonnes, comme ceci:Comment lire le fichier CSV avec nombre différent de colonnes avec Spring Batch

col1,col2,col3,col4,col5  
    val1,val2,val3,val4,val5 
    column1,column2,column3 
    value1,value2,value3 

Est-il possible de lire ce genre du fichier CSV avec Spring Batch?

J'ai essayé de le faire:

<bean id="ItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"> 

    <!-- Read a csv file --> 
    <property name="resource" value="classpath:file.csv" /> 

    <property name="lineMapper"> 
     <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
      <!-- split it --> 
      <property name="lineTokenizer"> 
       <bean 
        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
        <property name="names" 
         value="col1,col2,col3,col4,col5,column1,column2,column3" /> 
       </bean> 
      </property> 
      <property name="fieldSetMapper"> 
       <bean 
        class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> 
        <property name="prototypeBeanName" value="myBean" /> 
       </bean> 
      </property> 

     </bean> 
    </property> 

</bean> 

Mais le résultat est cette erreur:

IncorrectTokenCountException stack trace

+0

Jetez un oeil à la 'AbstractLineTokenizer # setStrict (Boolean)' (qui 'DelimitedLineTokenizer' hérite de) et le mettre à' false'. – fateddy

+0

cette méthode ne fonctionne pas :( – marie

Répondre

1

Vous pouvez utiliser le PatternMatchingCompositeLineMapper de déléguer à la LineMapper mise en œuvre appropriée par ligne basée sur un modèle. À partir de là, chacun de vos délégués utilisera un DelimtedLineTokenizer et un FieldSetMapper pour mapper la ligne en conséquence.

Vous pouvez en lire plus à ce sujet dans la documentation ici: http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapper.html

+0

Merci beaucoup @Michael – marie