Talend : XML with multiple header => 用 Talend 的作业拆分文件

Talend : XML with multiple header => split the file with Talend's job

我收到的文件有多个问题 header =>

[XML 图片][1]

我想用 talend 创建一个作业,将其拆分为多个文件或创建一个可读文件。

我试了很多方法都没有成功。

我收到的文件是输出文件 (*.out),而不是开头的 XML。

感谢您的帮助! :)

编辑:

感谢回复:

例如:初始文件(*.out 文件)=>

<?xml version="1.0" encoding="UTF-8"?><Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><BkToCstmrDbtCdtNtfctn><GrpHdr><MsgId>AI3069868076</MsgId><CreDtTm>2017-04-03T23:51:23.586</CreDtTm><MsgPgntn><PgNb>1</PgNb><LastPgInd>true</LastPgInd></MsgPgntn></GrpHdr></BkToCstmrDbtCdtNtfctn></Document>
<?xml version="1.0" encoding="UTF-8"?><Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><BkToCstmrDbtCdtNtfctn><GrpHdr><MsgId>AI4069973130</MsgId><CreDtTm>2017-04-04T21:09:41.090</CreDtTm><MsgPgntn><PgNb>1</PgNb><LastPgInd>true</LastPgInd></MsgPgntn></GrpHdr></BkToCstmrDbtCdtNtfctn></Document>
<?xml version="1.0" encoding="UTF-8"?><Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><BkToCstmrDbtCdtNtfctn><GrpHdr><MsgId>AI4069973134</MsgId><CreDtTm>2017-04-04T21:09:41.090</CreDtTm><MsgPgntn><PgNb>1</PgNb><LastPgInd>true</LastPgInd></MsgPgntn></GrpHdr></BkToCstmrDbtCdtNtfctn></Document>

我会

文件 1 :

<?xml version="1.0" encoding="UTF-8"?><Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><BkToCstmrDbtCdtNtfctn><GrpHdr><MsgId>AI3069868076</MsgId><CreDtTm>2017-04-03T23:51:23.586</CreDtTm><MsgPgntn><PgNb>1</PgNb><LastPgInd>true</LastPgInd></MsgPgntn></GrpHdr></BkToCstmrDbtCdtNtfctn></Document>

文件 2 :

<?xml version="1.0" encoding="UTF-8"?><Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><BkToCstmrDbtCdtNtfctn><GrpHdr><MsgId>AI4069973130</MsgId><CreDtTm>2017-04-04T21:09:41.090</CreDtTm><MsgPgntn><PgNb>1</PgNb><LastPgInd>true</LastPgInd></MsgPgntn></GrpHdr></BkToCstmrDbtCdtNtfctn></Document>

文件 3 :

<?xml version="1.0" encoding="UTF-8"?><Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.054.001.02"><BkToCstmrDbtCdtNtfctn><GrpHdr><MsgId>AI4069973134</MsgId><CreDtTm>2017-04-04T21:09:41.090</CreDtTm><MsgPgntn><PgNb>1</PgNb><LastPgInd>true</LastPgInd></MsgPgntn></GrpHdr></BkToCstmrDbtCdtNtfctn></Document>

'Cause the inital file is unreadable ! :'(

如果题目只是为输入文件的每条记录生成一个单独的文件,你可以这样进行:

  • tSetGlobalVar 初始化名为 "fileCounter" 的变量值为 1(将用于输出文件命名)
  • tFileList 遍历要转换的文件(即使只有 1 个)
  • tFileInputFullRow 一次读取输入文件 1 行
  • tFlowToIterate 迭代当前文件的每个输入行
  • tFixedFlowInput 将输入流的每个字段转换为全局变量(这里称为 "line" 因为 tFileInputFullRow)并重新启动流(生成的全局变量不会在本例中使用)
  • tJavaRow 增加 "fileCounter" 值并将当前行传输到输出文件

    output_row.line = input_row.content;
    globalMap.put("fileCounter", ((Integer)globalMap.get("fileCounter"))+1);</pre>

  • tFileOutputRaw 为当前行生成输出文件 - 只需根据当前行等级设置文件名:

    ((String)globalMap.get("tFileList_1_CURRENT_FILEPATH")).replace(".xml", "") + (Integer)globalMap.get("fileCounter") + ".xml"</pre>

在此示例中,源文件名应该以“.xml”结尾,但您可以轻松地自行安排。

结果如下(1 个输入文件有 3 个记录 = 3 个输出文件):

检查:

  • tFileInputFullRow 架构仅包含 1 个名为 "line" 的字段(这是默认值)
  • tFixedFlowInput 架构仅包含 1 个名为 "content" 的字段,其中填充了“((String)globalMap.get("row1.line"))”

同时检查 tJavaRow 架构是否如下所示:

您可以根据需要更改字段名称,但它们必须与作业一致。