Я использую Apache Camel для разделения потока файлов с помощью регулярных выражений.Мне нужно сохранить разделители, поэтому я использую следующее регулярное выражение:
(?=\r\n[0-9]{2}00)
для разрывов строк в Windows с возвратом каретки.
Однако я хочу поддерживать разрывы строк в Windows и Linux, поэтомуЯ думал, что что-то вроде этого должно работать:
(?=\r?\n[0-9]{2}00)
или даже (?=(\r\n|\n)[0-9]{2}00)
Но по какой-то причине выполнение любого из указанных выше вариантов дает мне некоторые выходные данные с нулевым значением, и поэтомуон прерывается после того, как мне нужно запустить несколько подстрок и т. д.
Я также протестировал другие варианты, например:
(?=.\n[0-9]{2}00)
(?=^[0-9]{2}00)
(я сохраняю разрыв строки в предыдущей группе)
но с любым из них я получаю пустой вывод либо в начале, либо в конце.
РЕДАКТИРОВАТЬ: Добавлен верблюжий маршрут
<route id="FileRoute" trace="false">
<from uri="file:{{file.path}}?move=.done&readLock=changed&readLockCheckInterval=1500&charset=UTF-8"/>
<split streaming="true" stopOnException="true" shareUnitOfWork="true" parallelProcessing="true">
<tokenize token="(?=\R[0-9]{2}00)" regex="true" />
<setHeader headerName="CamelSplitIndex">
<!-- line number basically -->
<simple>${property.CamelSplitIndex}</simple>
</setHeader>
<setHeader headerName="CamelSplitComplete">
<!-- did I read the last line? -->
<simple>${property.CamelSplitComplete}</simple>
</setHeader>
<log message="Line: ${property.CamelSplitIndex}: BODY: ${body}"/>
<choice>
<when>
<simple>${property.CamelSplitIndex} == 0</simple>
<!-- skip first line as its a header -->
</when>
<otherwise>
<setProperty propertyName="StringFound">
<simple>${body.substring(5,24).trim()}</simple>
</setProperty>
<setHeader headerName="ModifiedStringFound">
<simple>${property.StringFound}</simple>
</setHeader>
<process ref="ProcessName"/>
<transform>
<simple>${body.replace(${property.StringFound}, ${header.ModifiedStringFound})}</simple>
</transform>
<removeHeader headerName="ModifiedStringFound"/>
</otherwise>
</choice>
<aggregate strategyRef="AggregationStrategy" completionTimeout="15000">
<correlationExpression>
<simple>${in.header.CamelFileName}</simple>
</correlationExpression>
<completionTimeout>
<header>timeout</header>
</completionTimeout>
<to uri="log:com.blah.blah.out"/>
</aggregate>
</split>
</route>
Ошибка:
org.apache.camel.language.bean.RuntimeBeanExpressionException: не удалось вызвать метод: .substring (5,24) .trim () для null из-за: org.apache.camel.language.bean.RuntimeBeanExpressionException: не удалось вызвать метод: substring (5,24) впусто из-за: java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: 24
Пример файла:
78643756435694369 4754757864254578754578545457 0071
05007684546545465745 1740266981415800014580631000874120180521185558 000000000247986DFGBDFH FDGDGJHUHJK SDFGSGDFGf GT 541100898 00710047503051 0220180522
0501 000000 000000000000 046 00000103971056242218759000000000000 000000000000 000000 00000000000
0502 GH 001000000000000000000
05005212455451257521 1740266981415800001820031000874120180521183349 000000001817986FGHDFHFGJFGDHGDFDFH FDGFDHGFDHDFH 541100898 00710043090051 0220180522
0501 000000 000000000000 046 00000100293449142130526000000000000 000000000000 000000 00000000000
0502 FD 001000000000000000000
05009789265762578888 1740266981415800012612361003716920180521173412 000000004859986DFHDGJFGJFGJKHGJGHJ GDHFGHFGHFGH 541100898 00710029706451 0220180522
0501 000000 000000000000 046 00000103058175142271046000000000000 000000000000 000000 00000000000
0502 AR 001000000000000000000
05008758407825904958 1740266981415800004933011003716920180521173559 000000000798986FGHGFGHRTUJHGJDGHYHTJK DHDGJFHJHFHJ NJ 541100898 00710030461251 0220180522
0501 000000 000000000000 046 00000100902124678647109000000000000 000000000000 000000 00000000000
0502 TY 001000000000000000000
05004987785686893465 1740266981415800003253131003716920180521174415 000000001142986FDGFDGHFGJTYUJDFHGDEHGTGFH DFHDYRT BG 541100898 00710032033851 0220180522
0501 000000 000000000000 046 00000100620274678526079000000000000 000000000000 000000 00000000000
0502 UI 001000000000000000000
Есть идеи, как решить эту проблему?