Добавить в CSV-файл с заголовком в Apache Camel

#csv #apache-camel

#csv #apache-camel

Вопрос:

Мне нужно создать csv-файл на основе входящих сообщений. Я делаю это, добавляя к файлу с:

 .toD("file://"   OUTPUT_PATH   "?FileName=${exchangeProperty.OUTPUT_FILENAME}"   "amp;FileExist=Append")
  

Хотя это работает нормально, я столкнулся с одной проблемой. Мне также нужно включить строку заголовка в файл CSV. Прямо сейчас я выполняю маршалинг в формате CSV с помощью .mashall().csv(), но при этом заголовок опускается.

Хотя я могу создать формат CSV с заголовком с:

 CsvDataFormat csvFormatWithHeader = new CsvDataFormat();
csvFormatWithHeader.setHeader(Arrays.asList(new String[] { "A", "B", "C", "D" }.clone()));

.marshall(csvFormatWithHeader)
  

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

Я пробовал два подхода, но ни один из них не сработал:

  1. Проверьте, существует ли файл в маршруте, и соответствующим образом примените формат csv
  2. Установите формат данных marshall с помощью компонента или метода

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

Как я могу достичь любого из этих подходов с помощью Apache Camel 2.23.2.

Ответ №1:

Хорошо, в конечном итоге, используя заголовок, я смог заставить вариант 1 работать. Вот как выглядит мой маршрут сейчас:

 .setProperty("OUTPUT_FILENAME",method(this, "determineOutputFilename()"))
.setHeader("fileExists", method(this, "outputFileExists"))
.choice()
  .when(header("fileExists"))
    .marshal().csv()
  .endChoice()
  .otherwise()
    .marshal(csvFormatWithHeader)
  .endChoice()
.end()
  

Логика проверки файла (реализована в классе route):

 public boolean outputFileExists(@ExchangeProperty("OUTPUT_FILENAME") String fileName){
    boolean fileExists = new File(PROCESSING_PATH   "/"   fileName).exists();
    return fileExists;
}