簡體   English   中英

FTP使用Talend,只獲取最新文件?

[英]FTP using Talend, get only most recent file?

我有一個Talend作業,我需要從sFTP服務器下載XML文件,然后處理成Oracle數據庫。 XML提取的日期在文件名中,例如“FileNameHere_Outbound_201407092215.xml”,我相信是yyyyMMddhhmm格式。 “FileNameHere”的開頭部分對於所有文件都是相同的。 我需要能夠從文件名末尾讀取日期,並且只從服務器中取出該日期以進行處理。

我不知道如何用FTP做到這一點。 我之前使用過tFilelist按日期降序排序,但這不是FTP的選項。 我知道它可能有一些Java涉及如何拉出文件名的部分,但我不是很懂Java。 我可以通過一些幫助來管理。

有沒有人知道如何只從FTP下載最新的文件?

調色板上有一個tFTPFileList組件。 這應該為您提供FTP位置上所有文件的列表。 從這里開始,您需要解析可以使用正則表達式完成的時間戳,或者根據您感覺更舒適的方式對其進行子串。

然后,這只是一個按提取的時間戳排序然后為您提供最新文件名的情況,以便您可以獲取該特定文件。

這里有一個過於費力的方法來完成這項工作,但它有效。 你也應該能夠輕松地調整它:

作業布局示例

在上面的工作設計中,我選擇了tFileList而不是tFTPFileList,因為我沒有一個示例FTP位置可以在這里進行測試。 前提保持不變,盡管由於能夠按修改日期(以及其他選項)進行排序,因此對於真實的tFileList而言這將是毫無意義的。

我們首先運行tFileList / tFTPFileList組件來遍歷所有文件(它們可以對這些文件進行掩碼,以限制你在這里返回的內容)。 然后我們迭代地將它讀到tFixedFlowInput組件,它允許我們在tFileList / tFTPFileList遍歷每個文件時從globalMap中檢索值:

使用tFixedFlowInput組件從globalMap檢索值

我列出了tFileList提供的所有內容(您可以通過按ctrl+space查看選項),但您只需要文件名,可能還需要文件路徑或文件目錄。 然后我們將所有內容都放入一個帶有tBufferOutput組件的緩沖區中,以便我們可以收集該位置的每個迭代。

一旦tFileList / tFTPFileList迭代了目錄中的每個文件,它就會觸發帶有OnSubjobOk鏈接的下一個子作業,我們首先用tBufferInput組件讀回已完成的緩沖區。 此時我已經開始在整個流程中散布tLogRow組件,這樣我就可以更好地可視化每一步的數據。

之后,我們使用tExtractRegexFields組件從文件名中提取日期時間戳:

該圖顯示了tExtractRegexFields組件的配置

在這里,我使用以下正則表達式"^.+?_Outbound_([0-9]{12})\\\\.xml$"來捕獲日期時間戳。 它依賴於文件名是任何字符的組合,后跟字符串文字_Outbound_ ,然后是我們想要捕獲的日期時間戳(由12個數字字符表示),然后用.xml結束。

我們還在我們的模式中添加一列以適應捕獲的日期時間戳,如下所示:

tExtractRegexFields組件的模式

由於額外列是yyyyMMddhhmm形式的日期時間戳,我們可以在此直接指定它並從此開始將其用作日期對象。

從這里開始,我們只需按提取的日期時間戳列中的日期降序進行排序,然后使用tSampleRow根據組件配置的指導僅獲取數據流的第一行。

要完成此任務,您可以將目標文件路徑輸出到globalMap(在tJavaRow中或使用將自動為您執行此操作的tFlowToIterate),然后在tFTPFileGet的文件掩碼設置中使用globalMap存儲文件路徑:

使用tFlowToIterate和tFTPGet配置將數據放入globalMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM