【问题标题】:Talend : XML with multiple header => split the file with Talend's jobTalend : 具有多个标题的 XML => 使用 Talend 的作业拆分文件
【发布时间】:2017-04-10 14:36:35
【问题描述】:

我收到的文件有问题,它有多个标题 =>

[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>

'因为初始文件不可读! :'(

【问题讨论】:

    标签: xml talend


    【解决方案1】:

    检查:

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

    还要检查 tJavaRow 架构是否如下所示:

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

    【讨论】:

    • 真的很大,谢谢它的工作原理:! :) 我把我妻子的肖像从我的桌子上拿下来,然后放上你的 :p
    • 对不起你的妻子!
    【解决方案2】:

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

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

      output_row.line = input_row.content;
      globalMap.put("fileCounter", ((Integer)globalMap.get("fileCounter"))+1);
    • tFileOutputRaw 为当前行生成输出文件 - 只需根据当前行排名设置文件名:

      ((String)globalMap.get("tFileList_1_CURRENT_FILEPATH")).replace(".xml", "") + (Integer)globalMap.get("fileCounter") + ".xml"

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

    这是结果(1 个输入文件,3 个记录 = 3 个输出文件):

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      相关资源
      最近更新 更多