【问题标题】:Apache Commons VFS - How to open whatever dir follow by specific dir?Apache Commons VFS - 如何打开特定目录后面的任何目录?
【发布时间】:2019-04-01 22:24:49
【问题描述】:

我认为这很简单,但有些我失败了。

我有这个:

ftp://user:password@host/Folder/Folder/Folder/../${Year}/${Month}/*.csv

我正在尝试打开特定文件夹名称后跟的任何文件夹名称。我正在尝试使用这样的路径访问文件但失败了。失败在这部分/../

/../ 这部分应该表示任何文件夹,但不知何故路径会返回到上一个文件夹。需要打开 3 个文件夹有一个修复名称,所以我无法更改它。

例如,当我使用这个ftp://user:password@host/Folder/Folder/Folder/../${Year}/${Month}/*.csv 路径时,它将打开像这样ftp://user:password@host/Folder/Folder/${Year}/${Month}/*.csv 的文件夹。它会返回 1 个文件夹,然后是变量中的文件夹,然后是文件。

我使用这个/../,因为在我打开 3 个文件夹之后,我应该检查大约 30 多个文件夹,然后是两个文件夹,如 ${Year}/${Month} 和 3 种类型的正则表达式文件,如 A*.csv B*.csv C*.csv

我使用Text File Input Step 使用路径访问 Pentaho 数据集成(又名 Kettle)上的文件。

我想将/../ 设置为变量值,但该变量中至少有一个值和两个最大值,所以我不能,因为我有 30 多个值。

我尝试使用Copy row to resultGet row from result 并在转换上执行Execute every input row,但结果总是失败,每次执行它总是第一行,字段第一行的值相同(字段包含 30+ 个文件夹名 I需要),它不会移动到具有不同值的下一行。

我已经用这个正则表达式[^\/]+\/${Year}\/${Month}\/A.* 尝试了这条路径ftp://user:password@host/Folder/Folder/Folder/(失败)
或者
此路径 ftp://user:password@host/Folder/Folder/Folder/[^\/]+\/${Year}\/${Month}\/ 与此正则表达式 A.*(失败)

那么,还有什么建议吗?

注意,我的语法很糟糕,所以堆垛机允许编辑这个问题。

【问题讨论】:

  • 您确定要访问的目录不受保护吗?
  • 文件名是一个正则表达式。试试/\.\./ 而不是/../
  • @AlainD 是的,我确定。不知何故 /../ 部分意思是返回上一个文件夹。

标签: kettle pentaho-data-integration file-access pdi apache-commons-vfs


【解决方案1】:

我认为“获取文件名”步骤不能像您希望的那样在一行中进行多次搜索,您可以从单点向前列出所有文件夹。

ftp://user:password@host/Folder ... 列出从这一点开始的所有子文件夹,使用 .* RegExp 分配包含子文件夹,然后在过滤器选项卡中,获取 [仅文件夹],这将列出从起点开始的所有文件夹,从这里您可以使用过滤步骤来验证要使用哪一个。

【讨论】:

    【解决方案2】:

    好吧,经过几天的努力,它仍然无法使用正则表达式的那种路径。

    但我得到了另一个替代答案。它需要比预期更多的步骤。所以,就在这里(大家可以参考一下):

    1. 使用Table Input 步骤并从数据库中获取您想在路径上使用的所有文件夹名称。如果你没有,做一个。
    2. 使用Formula 步骤。将Table InputFormula 连接并生成值。

      例如:

      字段名称:[fill yourself]

      值:"ftp://user:password@host/Folder/" & [folder from db]

      您可以根据需要将"ftp://user:password@host/[your folder]/[again]/.."& [table value] "/" & [any value] "/" ... 结合使用

      您还可以使用Calculator 步骤生成正则表达式值。

    3. 使用Get File Name 步骤或Text File Input 步骤。将Formula 连接到此。双击此步骤,勾选复选框Accept filename from a field。选择您之前创建的[path] 字段,同时选择您创建的[regex] 字段。

    那么它就完成了,你可以在第三步之后做任何事情。这是唯一的替代方法,如果有人可以教我如何仅使用路径和正则表达式来做到这一点,我真的很感激。

    P.S 我为语法道歉。还在学习中。

    【讨论】:

      【解决方案3】:

      如果将 /../ 替换为 /\.\./ 不起作用,您可以尝试以下操作:

      【讨论】:

      • 嗯,它没有。我可能无法使用此解决方案。我将在我的问题中添加和解释更多内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      相关资源
      最近更新 更多