从 CSV 文件中筛选出正确的记录,从而使用 Anypoint Studio 执行所需的操作
To filter out the right records from a CSV file and hence to perform the required operation using Anypoint Studio
我正在处理一个应该从系统中获取 CSV 文件并将包含的数据插入数据库的流程。文件中的某些记录的格式不正确(例如:列数错误),因此必须写入另一个文本类型的文件进行分析。
我创建了一个流程,将所有好的记录插入数据库,但不会将坏记录输入文件。我目前是初学者,因此不确定如何进行。
XML代码:
<flow name="fileFlow">
<file:inbound-endpoint path="src/main/resources/Input" moveToPattern="#[message.inboundProperties.originalFilename].zip" moveToDirectory="src/main/resources/Output" responseTimeout="10000" metadata:id="b85f6b05-1679-4b60-8bbe-30e6d2c68df7" doc:name="File">
<file:filename-regex-filter pattern=".*csv" caseSensitive="true"/>
</file:inbound-endpoint>
<file:file-to-string-transformer doc:name="File to String"/>
<set-payload value="#[payload.replaceAll(",,", ", ,")]" doc:name="Set Payload"/>
<splitter expression="#[rows=StringUtils.split(message.payload,'\r\n');ArrayUtils.subarray(rows,1,rows.size())]" doc:name="Splitter"/>
<flow-ref name="fileFlow1" doc:name="fileFlow1"/>
<catch-exception-strategy doc:name="Insert the bad record into a file">
<byte-array-to-string-transformer doc:name="Byte Array to String"/>
<set-session-variable variableName="var" value="#[payload+'var']" doc:name="Session Variable"/>
<file:outbound-endpoint path="src/main/resources/Output" outputPattern="BadRecords.txt" responseTimeout="10000" doc:name="File"/>
<flow-ref name="fileFlow1" doc:name="fileFlow1"/>
</catch-exception-strategy>
</flow>
<flow name="fileFlow1">
<expression-transformer expression="#[StringUtils.split(message.payload,',')]" doc:name="Expression"/>
<db:insert config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into GoodRecords values(#[message.payload[0]], #[message.payload[1]], #[message.payload[2]], #[message.payload[3]], #[message.payload[4]], #[message.payload[5]], #[message.payload[6]], #[message.payload[7]], #[message.payload[8]], #[message.payload[9]], #[message.payload[10]], #[message.payload[11]], #[message.payload[12]], #[message.payload[13]], #[message.payload[14]], #[message.payload[15]], #[message.payload[16]], #[message.payload[17]], #[message.payload[18]], #[message.payload[19]], #[message.payload[20]])]]></db:parameterized-query>
</db:insert>
<logger message="#[payload] " level="INFO" doc:name="Logger"/>
</flow>
流程结构:
Flow diagram
我个人认为我创建的流程非常低效且错误。
如何将错误记录输入文件(如果给定流程正确)?
我想对给定的用例使用 批量模式(因为有大约 1000 条奇怪的记录可以使用)但我也不确定如何继续。
在您的代码中,您使用了专用流程将记录插入数据库。所以在插入过程中发生的任何异常都不会被父流异常策略捕获,你可以为你的私有流有单独的异常策略或者你可以使用sub-flow。
还有另一个干净的解决方案,您可以使用批处理来处理这些记录并创建一个单独的步骤来处理所有失败记录。
我正在处理一个应该从系统中获取 CSV 文件并将包含的数据插入数据库的流程。文件中的某些记录的格式不正确(例如:列数错误),因此必须写入另一个文本类型的文件进行分析。
我创建了一个流程,将所有好的记录插入数据库,但不会将坏记录输入文件。我目前是初学者,因此不确定如何进行。
XML代码:
<flow name="fileFlow">
<file:inbound-endpoint path="src/main/resources/Input" moveToPattern="#[message.inboundProperties.originalFilename].zip" moveToDirectory="src/main/resources/Output" responseTimeout="10000" metadata:id="b85f6b05-1679-4b60-8bbe-30e6d2c68df7" doc:name="File">
<file:filename-regex-filter pattern=".*csv" caseSensitive="true"/>
</file:inbound-endpoint>
<file:file-to-string-transformer doc:name="File to String"/>
<set-payload value="#[payload.replaceAll(",,", ", ,")]" doc:name="Set Payload"/>
<splitter expression="#[rows=StringUtils.split(message.payload,'\r\n');ArrayUtils.subarray(rows,1,rows.size())]" doc:name="Splitter"/>
<flow-ref name="fileFlow1" doc:name="fileFlow1"/>
<catch-exception-strategy doc:name="Insert the bad record into a file">
<byte-array-to-string-transformer doc:name="Byte Array to String"/>
<set-session-variable variableName="var" value="#[payload+'var']" doc:name="Session Variable"/>
<file:outbound-endpoint path="src/main/resources/Output" outputPattern="BadRecords.txt" responseTimeout="10000" doc:name="File"/>
<flow-ref name="fileFlow1" doc:name="fileFlow1"/>
</catch-exception-strategy>
</flow>
<flow name="fileFlow1">
<expression-transformer expression="#[StringUtils.split(message.payload,',')]" doc:name="Expression"/>
<db:insert config-ref="MySQL_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into GoodRecords values(#[message.payload[0]], #[message.payload[1]], #[message.payload[2]], #[message.payload[3]], #[message.payload[4]], #[message.payload[5]], #[message.payload[6]], #[message.payload[7]], #[message.payload[8]], #[message.payload[9]], #[message.payload[10]], #[message.payload[11]], #[message.payload[12]], #[message.payload[13]], #[message.payload[14]], #[message.payload[15]], #[message.payload[16]], #[message.payload[17]], #[message.payload[18]], #[message.payload[19]], #[message.payload[20]])]]></db:parameterized-query>
</db:insert>
<logger message="#[payload] " level="INFO" doc:name="Logger"/>
</flow>
流程结构:
Flow diagram
我个人认为我创建的流程非常低效且错误。
如何将错误记录输入文件(如果给定流程正确)? 我想对给定的用例使用 批量模式(因为有大约 1000 条奇怪的记录可以使用)但我也不确定如何继续。
在您的代码中,您使用了专用流程将记录插入数据库。所以在插入过程中发生的任何异常都不会被父流异常策略捕获,你可以为你的私有流有单独的异常策略或者你可以使用sub-flow。 还有另一个干净的解决方案,您可以使用批处理来处理这些记录并创建一个单独的步骤来处理所有失败记录。