我已经搜索了所有内容,并阅读 post 。
但它似乎并不完整,也不起作用。
情况:我需要从本地计算机上的目录中获取最后修改的文件。然后我需要将该文件传递给fileinputdelimited组件。
我目前有:
tfilelist - >迭代 - > titeratetoflow - > tsamplerow - > tflowtoiterate - > tinpufiledelimited ---> tlogrow(只是为了确保它拉出正确的文件)
但它不起作用。我已配置它。所以titeratetoflow有一个名为
的列tsamplerow仅限于“1”。
设置tiflowtoiterate
在tinputfile delimited的文件位置字段中,我有"((String)globalMap.get("FilePathComplete"))"
运行时,我收到错误消息 cannot find file or path
。如果我删除了fileinput组件并让它直接发送到tlogrow,它会显示一行空白条目。
有什么想法吗?
答案 0 :(得分:2)
我不确定你是否在这里稍微错误配置了这份工作,但它似乎对我有用。
这里有一些屏幕截图显示了我的工作设计:
通过查看你的帖子,我唯一能想到的就是你可能在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")
将始终从迭代列表中提供最后一个文件名,这是最新的文件。
主流:
组件视图: