【问题标题】:How can I parse multiple filenames from xml file using regex_substr如何使用 regex_substr 从 xml 文件中解析多个文件名
【发布时间】:2021-12-09 10:14:22
【问题描述】:

我有一个以 XML 格式存储在 CLOB 列中的 FTP 日志,我需要获取它找到并检索到的文件名。将 Table/Lateral 与 REGEX_SUBSTR 一起使用,我可以获得已知数量的文件所需的内容,但我无法弄清楚如何处理未知数量的文件。有一个字段返回找到的文件数 <FilesProcessed>3</FilesProcessed>。有没有办法使用该字段来帮助解析文件名?或者,更重要的是,有没有更好的方法来做到这一点?

(我在这里使用 CTE,但我会从数据库表中提取它(包含大量列,但没有文件名!)。

With PAYLOAD_DATA(LOGS) as(
VALUES
('<?xml version="1.0"?>
<InboundMFTEventDetailsDocument>
  <MFTEventExecutionDetails>
    <Status>Successful</Status>
    <FilesProcessed>3</FilesProcessed>
    <MFTEventLogID>5dn39m00fgmdefo80002g7ki</MFTEventLogID>
    <ExecutionLogs>
      <Logs>Finding file(s) in VFS Path:/Wholesale/CS/Inbound/SFTP/PROD-OUT-Shipment/, URL:SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/. 
        Filename Filter = INVPTH*.txt
        Found following 3 file(s).
           SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320006396.txt
           SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320009986.txt
           SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH092720210320009986.txt
      </Logs>
      <Logs>Starting copy of file(s) from VFS Path:/Wholesale/CS/Inbound/SFTP/PROD-OUT-Shipment/, URL:SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320006396.txt to VFS Path:/Wholesale/RLM/Outbound/SFTP/SERVERSERVICES-INBOUND-SHIPH/, URL:SFTP://MKWHLDV.kors.local:22/SERVERSERVICES/INBOUND/SHIPH/INVPTH033020210320006396.txt
Copy finished:VFS Path:/Wholesale/CS/Inbound/SFTP/PROD-OUT-Shipment/, URL:SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320006396.txt
</Logs>
      <Logs>...</Logs>
      <Logs>...</Logs>
      <Logs>...</Logs>
    </ExecutionLogs>
  </MFTEventExecutionDetails>
</InboundMFTEventDetailsDocument>'))

SELECT  FILENAME
FROM PAYLOAD_DATA A,
TABLE (VALUES (REGEXP_SUBSTR(LOGS, '  SFTP://.*[\r\n][   |\<]', 1, REGEXP_COUNT(LOGS, '  SFTP://.*[\r\n][   |\<]') - 0)),
              (REGEXP_SUBSTR(LOGS, '  SFTP://.*[\r\n][   |\<]', 1, REGEXP_COUNT(LOGS, '  SFTP://.*[\r\n][   |\<]') - 1)),
              (REGEXP_SUBSTR(LOGS, '  SFTP://.*[\r\n][   |\<]', 1, REGEXP_COUNT(LOGS, '  SFTP://.*[\r\n][   |\<]') - 2)),
              (REGEXP_SUBSTR(LOGS, '  SFTP://.*[\r\n][   |\<]', 1, REGEXP_COUNT(LOGS, '  SFTP://.*[\r\n][   |\<]') - 3)))  as G(FILENAME)
SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH092720210320009986.txt 
SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320009986.txt 
SFTP://ftp.some_server.com:22/UAT/OUT/Shipment/INVPTH033020210320006396.txt

【问题讨论】:

  • 请将您正在使用的数据库标签添加到您的问题中。

标签: regex substr db2-400


【解决方案1】:

可能是这样的

With PAYLOAD_DATA(LOGS) as(
...
)
occurrences (occ) as (values 1 union all select occ + 1 from occurrences where occ < (SELECT  REGEXP_COUNT(LOGS, '  SFTP://.*[\r\n][   |\<]') FROM PAYLOAD_DATA))
select REGEXP_SUBSTR(LOGS, '  (SFTP://.*)[\r\n][   |\<]', 1, occ, '', 1) filename from PAYLOAD_DATA, occurrences

【讨论】:

  • 完美!!!正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2018-07-01
  • 2013-02-06
相关资源
最近更新 更多