2015-01-07 4 views
2

У нас есть требование разделить большой CSV на несколько небольших CSV-файлов. Первая строка основного файла CSV содержит заголовок столбца, который мне нужно иметь во всех сгенерированных CSV-файлах.apache camel split csv file

Как это достичь?

Я могу разбить файл, используя маршрут Apache Camel Splitter следующим образом ...

 <split id="LineItemSplitter" streaming="true" 
      parallelProcessing="true" timeout="0"> 
      <tokenize token="\n" group="5000" /> 
      <to id="LineItemOutbox" 
       uri="file:/target?fileName=${file:name.noext}-${date:now:yyyyMMddHHmmssSSSSS}.csv?fileExist=Append" /> 
     </split> 

    </route> 

ответ

1

Один из возможных способов справиться с этим является использование шаблона агрегатор и имеют заголовки столбцов добавлен в класс стратегии.

Например смотри ниже:

 <aggregate strategyRef="messageAggregatorStrategy"> 
      <correlationExpression> 
       <constant>true</constant> 
      </correlationExpression> 
      <completionTimeout> 
       <simple>10000</simple> 
      </completionTimeout> 
      <completionSize> 
       <simple>500</simple> 
      </completionSize> 
      <to id="LineItemOutbox" 
        uri="file:/target?fileName=${file:name.noext}-${date:now:yyyyMMddHHmmssSSSSS}.csv?fileExist=Append" /> 
     </aggregate> 

Тогда ваша стратегия боб:

<bean id="messageAggregatorStrategy" class="com.youorg.MessageAggregator" /> 

Тогда в вашей стратегии вы можете установить заголовок столбца:

public class MessageAggregator implements AggregationStrategy 
{ 
    private static final Logger logger = Logger.getLogger(MessageAggregator.class); 
    private String COLUMN_HEADERS = "a,b,c"; 

    @Override 
    public Exchange aggregate(Exchange oldExchange, Exchange newExchange) 
    { 
     Exchange exchangeToReturn; 
     StringBuffer csvBuffer; 
     String csv = newExchange.getIn().getBody(String.class); 
     if (oldExchange == null) 
     { 
      csvBuffer = new StringBuffer(); 
      csvBuffer.append(COLUMN_HEADERS).append("\r\n"); 
      csvBuffer.append(csv); 
      newExchange.getIn().setBody(csvBuffer); 
      exchangeToReturn = newExchange; 
     } 
     else 
     { 
      csvBuffer = (StringBuffer) oldExchange.getIn().getBody(StringBuffer.class); 

      // update the existing message with the added body 
      csvBuffer.append("\r\n"); 
      csvBuffer.append(csv); 
      oldExchange.getIn().setBody(csvBuffer); 

      // and return it 
      exchangeToReturn = oldExchange; 
     } 
     return exchangeToReturn; 
    } 

Недостатком этого подход может работать, потому что вы повторно агрегируете вместо того, чтобы писать в целевой файл, но это делает достичь того, что вы ищете.

Надеюсь, что это поможет.

+0

Спасибо за ответ. Но как извлечь заголовок столбцов из файла, который может быть непосредственно использован в стратегии ??? –

+0

Вы не знаете впереди заголовков столбцов? Существуют ли несколько типов заголовков? –

+0

Это единственный маршрут, который будет использоваться для разбора разных файлов. Поэтому заголовки столбцов будут в каждом файле. Поэтому сначала нужно извлечь данные первой строки, которые будут заголовками столбцов, и могут быть использованы выше стратегии. –

Смежные вопросы