Обработка файлов построчно в муле

У меня есть требование в моем проекте обрабатывать CSV-файл построчно. Каждая строка csv будет вызывать оставшийся API, получать данные из API и создавать выходные полезные данные и, наконец, записывать файл.

Итак, предположим, что у меня есть 10 строк в файле csv, каждая строка будет вызывать API, получать данные из API и в конце записывать новый выходной файл xml с 10 сегментами.

Не могли бы вы предложить, какой компонент лучше всего подходит для разделения файла csv на каждую строку. Я предполагаю, что сплиттер или foreach могут служить этой цели. Но я не уверен на 100%. Любая помощь или указатель приветствуются.

ТИА


person mule-user    schedule 01.02.2016    source источник


Ответы (3)


Код ниже работает для меня

<configuration doc:name="Configuration">
<expression-language autoResolveVariables="true">
    <import class="org.mule.util.StringUtils" />
</expression-language>
</configuration>

<flow name="muleutilFlow6">
<file:inbound-endpoint path="C:\path\input sample" connector-ref="File" responseTimeout="10000" doc:name="File"/>
<object-to-string-transformer />
<splitter expression="#[StringUtils.split(message.payload, '\n\r')]" doc:name="Splitter" />
    <logger message="Line - #[payload]" level="INFO" doc:name="Logger"/>
person chethan    schedule 19.12.2016

Вы можете использовать файл и цикл for -

   <flow name="muleutilFlow6">
    <file:inbound-endpoint path="input" connector-ref="File" responseTimeout="10000" doc:name="File"/>
    <foreach collection="#[payload.split('\n')]]" doc:name="For Each">
        <logger message="Line - #[payload]" level="INFO" doc:name="Logger"/>
    </foreach>
</flow>

Или вы даже можете использовать пакет -

<flow name="muleutilFlow7">
    <file:inbound-endpoint path="input" connector-ref="File" responseTimeout="10000" doc:name="File"/>
    <file:file-to-string-transformer name="file-to-string" />
    <batch:execute name="muleutilBatch" doc:name="muleutilBatch"/>
</flow>
<batch:job name="muleutilBatch">
    <batch:input>
        <set-payload value="#[payload.split('\n')]" doc:name="Set Payload"/>
    </batch:input>
    <batch:process-records>
        <batch:step name="Batch_Step">
            <logger message="Line - #[payload]" level="INFO" doc:name="Logger"/>
        </batch:step>
    </batch:process-records>
</batch:job>
person Manik Magar    schedule 09.02.2016
comment
для партии я получаю ошибку ниже [Ошибка: невозможно разрешить метод: org.mule.transport.file.ReceiverFileInputStream.split(java.lang.String) [arglength=1]] [Near: {... payload.split( '\n') ....}] - person sonal; 28.06.2017
comment
@sonal, я обновил ответ, чтобы использовать файл в строку перед передачей ввода в пакет, попробуйте с этим. - person Manik Magar; 29.06.2017

Вы можете сделать следующую конфигурацию:

  1. Соединитель файлов (читай CSV)
  2. DataWeave (преобразование CSV в Java Map и XML)
  3. Разделитель коллекции (итерация карты)
  4. Вызов API и дальнейшая обработка данных
  5. Соединитель файлов (запись XML)

Или обратитесь к этому примеру: Использование Mule Studio для чтения CSV.... Однако вам нужны дальнейшие изменения для достижения требования.

person sulthony h    schedule 01.02.2016