SSIS包,用于将文件夹中的文件移动到SFTP目录。文件夹名称应与FTP文件夹匹配

问题描述 投票:0回答:1

我有一个带有ForEach File Enumerate循环(完全限定名称)的SSIS包,其中包含FTP任务。

该包在执行时将遍历以下目录中子文件夹中的文件

C:\ Test \ Test2 \ ABC \

*。txt

并且它将文件发布到FTP站点。

我在foreach循环中有一个名为@ [User :: Filename]的已定义变量。

但是FTP中有文件夹,我希望文件基于从C驱动器上获取的文件夹进入。

C:\ Test \ Test2 \ ABC \ A \ 1.txt

C:\ Test \ Test2 \ ABC \ B \ 2.txt

C:\ Test \ Test2 \ ABC \ C \ 3.txt

文件1.txt应该转到名为\ FTP \ A的FTP文件夹中>

文件2.txt应转到名为\ FTP \ B的FTP文件夹中>

文件3.txt应转到名为\ FTP \ C的FTP文件夹中>

我最初的想法是使远程路径成为一个变量,并放弃foreach循环变量的全限定名。

为此,我创建了一个名为@ [User :: FilenameFTP]的变量,并将以下内容输入到表达式中

"//FTP//" + 

 RIGHT(
       (LEFT(@[User::Filename], ABS((FINDSTRING(@[User::Filename], "//", 5)))), 

       ABS((FINDSTRING(@[User::Filename], "//", 5)-1)) - ABS((FINDSTRING(@[User::Filename], "//",4)+1))
      )

我以为这个公式会给我文件所在的C驱动器中的文件名,我将其用作FTP任务中的Remote Path变量。但是当我运行它时,文件仍然进入\ FTP \而不是子文件夹。

我对此运行了一个脚本任务,并且输出也不显示我想要的。我究竟做错了什么?不能通过这种方式在foreach循环中编辑变量吗?

我有一个SSIS包,其中包含一个ForEach文件枚举循环(完全限定名称),其中包含FTP任务。执行时,该包将通过......中子文件夹中的文件。

如果驱动器名称按显示的顺序(或多或少)出现,则这些名称应为反斜杠("\\"),而不是表达式中的正斜杠。可能不是问题,但我更改了它们以解决此问题。
使用C文件夹字符串,在编写的表达式中,ABS((FINDSTRING(@[User::Filename], "\\", 5)-1))ABS((FINDSTRING(@[User::Filename], "\\",4)+1))的值均等于19,因此该表达式可归纳为RIGHT(<<String>>,0),而在文档中为If integer_expression is zero, the function returns a zero-length string.。因此,您无需在FTP基本文件夹名称的末尾附加任何内容。

故障修复

[我们可能会把LEFTRIGHTFINDSTRING都弄乱了,但是如果您知道所使用的文件夹名称将始终是完全限定名称中的第五个元素(表达式是已经依赖),您可以使用TOKEN并指定以斜杠分隔的字符串的第五个元素来更快地到达那里:

TOKEN

哪个计算为"//FTP//" + TOKEN( @[User::Filename],"\\",5) +"//"

更多可持续修复

另一方面,如果您希望将来对代码进行一些过时的保护,则在考虑添加或消除文件夹层次结构级别的那天,我建议提取最后一个文件夹名称,而不考虑级别多少的文件夹优先。

[我们可以使用//FTP//C//和一些聪明的SUBSTRING来做到这一点,并以REVERSE的功劳归功于KeithL,这让我感到困惑。

this answer接受三个参数。我们有字符串SUBSTRING,所以是一个。第二个是从字符串的左端开始的位置,第三个是要提取的字符数。

要获得起始位置,我们将使用@[User::Filename]来计算倒数第二个斜线的位置,以对字符串右端的字符进行计数:

REVERSE

因此,我们的起始位置是字符串的总长度,减去返回倒数第二个斜杠的字符数。

FINDSTRING(REVERSE( @[User::Filename]),"\\",2) (evaluates to 8 here)

我们可以通过从第二个斜杠到最后一个斜杠的反向位置减去最后一个斜杠的反向位置,然后再减去一个斜杠来获得要拉出的字符数,因为我们还不希望字符串中的末尾斜杠。

LEN( @[User::Filename]) - FINDSTRING(REVERSE( @[User::Filename]),"\\",2) (=17)

还有我们的三个论点。将所有内容与您的基本文件夹名称放在一起(我添加了一个斜杠。如果这样对您不起作用,请从那里删除!):

FINDSTRING(REVERSE( @[User::Filename]),"\\",2) 
- FINDSTRING(REVERSE( @[User::Filename]),"\\",1) - 1 (= 1 in our example)

计算为"//FTP//" + SUBSTRING( @[User::Filename] , LEN( @[User::Filename]) - FINDSTRING(REVERSE( @[User::Filename]),"\\",2), FINDSTRING(REVERSE( @[User::Filename]),"\\",2) -FINDSTRING(REVERSE( @[User::Filename]),"\\",1)-1 ) + "//"

现在,当决定“清理”该源服务器的权力,//FTP//C//层突然消失,或者事情变得疯狂,而您将这层深层掩埋时,您的代码仍然可以工作。 

旁注

[如果您确实在文件路径名中使用驱动器号,例如Test2,请注意,在本地运行软件包时,这就是软件包正在使用的C:\驱动器,但是在部署时,它会在

服务器的

C:\驱动器上四处查看,可能只是不喜欢它找到的内容,或更可能是找不到它。
sql visual-studio ssis sql-server-data-tools
1个回答
0
投票
使用C文件夹字符串,在编写的表达式中,ABS((FINDSTRING(@[User::Filename], "\\", 5)-1))ABS((FINDSTRING(@[User::Filename], "\\",4)+1))的值均等于19,因此该表达式可归纳为RIGHT(<<String>>,0),而在文档中为If integer_expression is zero, the function returns a zero-length string.。因此,您无需在FTP基本文件夹名称的末尾附加任何内容。

故障修复

© www.soinside.com 2019 - 2024. All rights reserved.