我一直在从平面文件源开发SSIS包。该文件每天发送一次,文件名具有如下所示的日期时间指示:
Filename_20190509042908.txt
我想知道如何才能通过日期部分;我希望软件包动态读取文件,但是它应该不带最后6位数字通过,我只是不需要最后6位数字,因为它不一致。
我想传递Filename_20190509.txt
我已经弄清楚了如何删除日期部分之前的文件名。因此,我很难通过忽略文件扩展名前的后6位数字来使程序包动态读取文件名。
有人可以帮我吗?
答案 0 :(得分:1)
假定完整文件路径存储在名为@[User::FilePath]
您必须添加一个字符串类型的变量(例如:@[User::Filename]
),在数据流任务之前添加一个Expression Task
并使用以下表达式:
@[User::Filename] = SUBSTRING(@[User::FilePath], 1, LEN(@[User::FilePath]) -
FINDSTRING(REVERSE(@[User::FilePath]), "\\", 1)) + "\\" +
LEFT(TOKEN(@[User::FilePath],"\\",TOKENCOUNT(@[User::FilePath],"\\")),
LEN(TOKEN(@[User::FilePath],"\\",TOKENCOUNT(@[User::FilePath],"\\"))) - 10) + ".txt"
示例:
如果@[User::FilePath]
的值为
C:\ New Folder \ 1 \ Filename_20190503001221.txt
然后@[User::Filename]
将是:
C:\ New Folder \ 1 \ Filename_20190503.txt
如果只有文件名为
文件名_20190503001221.txt
并且文件夹路径存储在另一个变量中,只需使用以下表达式:
@[User::Filename] = @[User::Folderpath] + "\\" +
LEFT(TOKEN(@[User::FilePath],"\\",TOKENCOUNT(@[User::FilePath],"\\")),
LEN(TOKEN(@[User::FilePath],"\\",TOKENCOUNT(@[User::FilePath],"\\"))) - 10) + ".txt"
单击用于读取源文件的平面文件连接管理器,按 F4 以显示“属性”选项卡,单击“表达式”属性并将以下表达式分配给connectionstring
属性:
@[User::Filename]
现在将数据流任务 Delay validation
属性值更改为True
。
答案 1 :(得分:0)
我必须假设您正在更改文件名的同时已经在使用foreach循环,但这是如何将完全限定名称更改为您想要的名称:
TOKEN(character_expression, delimiter_string, occurrence)
您的用法:
这将为您提供完整的文件名:
exp = TOKEN(@filename,"\",LEN(@filename)-LEN(replace(@filename,"\",""))
然后从那里开始使用左键并添加.txt
left(exp,LEN(exp)-10) + ".txt"