Talend如何将上次修改的文件传递给TFileInputDelimited?

时间:2014-04-03 06:43:20

标签: talend

我已经搜索了所有内容,并阅读 post

但它似乎并不完整,也不起作用。

情况:我需要从本地计算机上的目录中获取最后修改的文件。然后我需要将该文件传递给fileinputdelimited组件。

我目前有:

  

tfilelist - >迭代 - > titeratetoflow - > tsamplerow    - > tflowtoiterate - > tinpufiledelimited ---> tlogrow(只是为了确保它拉出正确的文件)

但它不起作用。我已配置它。所以titeratetoflow有一个名为

的列
  • “FileName”以“((String)globalMap.get(”CURRENT_FILE“))”作为值,
  • “FileDirectory”以((String)globalMap.get(“CURRENT_FILEDIRECTORY”))作为值,
  • “FileAndDirectory”,((String)globalMap.get(“CURRENT_FILEPATH”))为值。

tsamplerow仅限于“1”。

设置tiflowtoiterate

  • “FileNameOnly”是“FileName”
  • 的值
  • “FileDirectoryOnly”是“FileDirectory”和
  • “FilePathComplete”是“FileAndDirectory”

在tinputfile delimited的文件位置字段中,我有"((String)globalMap.get("FilePathComplete"))"

运行时,我收到错误消息 cannot find file or path 。如果我删除了fileinput组件并让它直接发送到tlogrow,它会显示一行空白条目。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我不确定你是否在这里稍微错误配置了这份工作,但它似乎对我有用。

这里有一些屏幕截图显示了我的工作设计:

Main Job design

tFileList configuration

tIterateToFlow configuration

tFlowToIterate configuration

tFileInputDelimited configuration

通过查看你的帖子,我唯一能想到的就是你可能在tFlowToIterate中略微搞砸了键值对组合。我倾向于发现那里的默认设置几乎可以在任何时候运行良好,并且它使它更明显地做了什么。

编辑:实际上,您可能在tIterateToFlow中使用了错误的值。 tFileList会将文件路径等的值抛出到全局映射中,但它将以唯一的组件名称开头。如果在值窗口中点击ctrl+space,它应该提示您一个可用值列表(这些值也在工作室的" Outline"选项卡中指定)。它通常会隐式转换为String,但为此您需要显式转换它,因此请使用.toString()而不是(String)

答案 1 :(得分:1)

获取上次修改文件的另一种方法如下

tFileList(按文件修改日期排序的DESC)------> tFixedFlowInput(schema - filename,filenumber)-----> tHashOutput

这里是tFixedFlowInput filename = file(String)globalMap.get(“tFileList_1_CURRENT_FILEPATH”)+“/”+(String)globalMap.get(“tFileList_1_CURRENT_FILE”)

filenumber =(整数)globalMap.get(“tFileList_1_NB_FILE”)

以上将完成的是获取目录中所有文件的列表及其编号/等级 - 其中上次修改的文件将具有文件编号= 1,旁边的文件将具有2 ...依此类推。

现在在上面的tFileList的SubJobOK上你可以有tHashInput,它将从tHashOutput上面读取并仅过滤filenumber == 1的行 - 这意味着最后修改的文件。

tHashInput(链接到tHashoutput)----> tFilterRow(filenumber == 1)------> tLogRow

您获得null的一个原因可能是您使用了globalMap.get(“CURRENT_FILEPATH”)而不是globalMap.get(“tFileList_1_CURRENT_FILEPATH”)

答案 2 :(得分:1)

上述问题的简单解决方案如下:

tFileList(按文件修改日期排序的ASC) - > tIterateToFlow - > tJava(只是为了结束subjob)。

然后在

subjob ok - > tfileinput(使用(String)globalMap.get("tFileList_1_CURRENT_FILE")(String)globalMap.get("tFileList_1_CURRENT_FILEPATH")作为文件名/文件路径)

<强>解释

由于tFileList以ASC顺序迭代所有文件,因此在最后一次迭代中,它将始终具有存储在globalMap中的最新文件名。该列表仅在tIterateToFlow之前进行迭代,因此该组件(String)globalMap.get("tFileList_1_CURRENT_FILE")将始终从迭代列表中提供最后一个文件名,这是最新的文件。

主流

enter image description here

组件视图:

enter image description here