SSIS 动态平面文件连接加载带有日期时间、分钟、秒时间戳的每日文件
SSIS dynamic flat file connection to load daily file with date-time,minute,second timestamp
我必须从网络位置加载每日 csv 文件,当它从 api 导出并保存到网络位置时,该文件具有带有分钟和秒的日期时间戳。
我正在尝试使我的包动态化,因此当文件名每隔一天更改时它不会更改。我试过在平面文件管理器连接属性中使用表达式,但它也不起作用。
我的文件名如下所示:
DS_All_users_with_additional_fields_2018_12_11_10_00.csv
我曾尝试使用以下表达式解决我的问题,但如果 csv 导出有延迟并且文件名中的分钟和秒更改,事情会变得复杂:
@[User::DataLoadDir]+"DS_All_users_with_additional_fields_"+(DT_STR,4,1252)YEAR( DATEADD( "dd", -1, getdate() ))+" _"+(DT_STR,4,1252)MONTH( DATEADD( "dd", -1, getdate() ))+"_"+(DT_STR,4,1252)DAY( DATEADD( "dd", 0, getdate() ))+"=25=]"
有什么解决这个问题的建议吗?
您需要导入的文件是否只是该目录中名称以 DS_All_users_with_additional_fields_
开头的文件?如果是这样,请使用脚本任务查找最近的一个并将连接字符串中使用的变量设置为此名称。以下示例使用 LINQ
查找以您列出的名称开头的文件,然后按创建日期对它们进行排序,returns 第一个文件的名称。下面的 Name
属性 将包含扩展名。您还可以通过将其更改为 FullName
属性 来获取完整的文件路径,在这种情况下,您可以仅将此值用于平面文件连接字符串使用的变量,而不是将其与@[User::DataLoadDir]
变量。此示例确实引用了 System.IO
和 System.Linq
,如下所述。
using System.IO;
using System.Linq;
string filePath = Dts.Variables["User::DataLoadDir"].Value.ToString();
DirectoryInfo di = new DirectoryInfo(filePath);
FileInfo mostRecentFile = (from f in di.GetFiles().Where(x =>
x.Name.StartsWith("DS_All_users_with_additional_fields_"))
orderby f.CreationTime descending
select f).First();
//The Name property below can be changed to FullName to get the complete file path
Dts.Variables["User::VariableHoldingFileName"].Value = mostRecentFile.Name;
您可以使用 foreach 循环文件枚举器并应用 filespec 表达式:
DS_All_users_with_additional_fields*.csv
*
服务器作为通配符,将选取与该字符串匹配的所有文件。您可以使用它来根据您的需要使其灵活。在这种情况下,作业将扫描特定文件夹中与上述字符串匹配的所有可用文件。然后可以将其分配给一个变量,您可以使用该变量动态设置连接字符串。
我认为您不能将 *
添加到连接字符串本身。
更新
要设置连接管理器的连接字符串 属性,请参见下图。值得注意的是,此解决方案将改变工作流程。您最初的工作流程是告诉连接管理器要专门查找什么文件。但是,通过实施 foreach 循环,该作业现在正在搜索特定文件夹路径中可用的所有文件。注意:您需要确保在连接字符串变量(即 \\networkpath\filename.csv)
中包含完全限定的域名 (FQDN)
我必须从网络位置加载每日 csv 文件,当它从 api 导出并保存到网络位置时,该文件具有带有分钟和秒的日期时间戳。 我正在尝试使我的包动态化,因此当文件名每隔一天更改时它不会更改。我试过在平面文件管理器连接属性中使用表达式,但它也不起作用。
我的文件名如下所示: DS_All_users_with_additional_fields_2018_12_11_10_00.csv
我曾尝试使用以下表达式解决我的问题,但如果 csv 导出有延迟并且文件名中的分钟和秒更改,事情会变得复杂:
@[User::DataLoadDir]+"DS_All_users_with_additional_fields_"+(DT_STR,4,1252)YEAR( DATEADD( "dd", -1, getdate() ))+" _"+(DT_STR,4,1252)MONTH( DATEADD( "dd", -1, getdate() ))+"_"+(DT_STR,4,1252)DAY( DATEADD( "dd", 0, getdate() ))+"=25=]"
有什么解决这个问题的建议吗?
您需要导入的文件是否只是该目录中名称以 DS_All_users_with_additional_fields_
开头的文件?如果是这样,请使用脚本任务查找最近的一个并将连接字符串中使用的变量设置为此名称。以下示例使用 LINQ
查找以您列出的名称开头的文件,然后按创建日期对它们进行排序,returns 第一个文件的名称。下面的 Name
属性 将包含扩展名。您还可以通过将其更改为 FullName
属性 来获取完整的文件路径,在这种情况下,您可以仅将此值用于平面文件连接字符串使用的变量,而不是将其与@[User::DataLoadDir]
变量。此示例确实引用了 System.IO
和 System.Linq
,如下所述。
using System.IO;
using System.Linq;
string filePath = Dts.Variables["User::DataLoadDir"].Value.ToString();
DirectoryInfo di = new DirectoryInfo(filePath);
FileInfo mostRecentFile = (from f in di.GetFiles().Where(x =>
x.Name.StartsWith("DS_All_users_with_additional_fields_"))
orderby f.CreationTime descending
select f).First();
//The Name property below can be changed to FullName to get the complete file path
Dts.Variables["User::VariableHoldingFileName"].Value = mostRecentFile.Name;
您可以使用 foreach 循环文件枚举器并应用 filespec 表达式:
DS_All_users_with_additional_fields*.csv
*
服务器作为通配符,将选取与该字符串匹配的所有文件。您可以使用它来根据您的需要使其灵活。在这种情况下,作业将扫描特定文件夹中与上述字符串匹配的所有可用文件。然后可以将其分配给一个变量,您可以使用该变量动态设置连接字符串。
我认为您不能将 *
添加到连接字符串本身。
更新
要设置连接管理器的连接字符串 属性,请参见下图。值得注意的是,此解决方案将改变工作流程。您最初的工作流程是告诉连接管理器要专门查找什么文件。但是,通过实施 foreach 循环,该作业现在正在搜索特定文件夹路径中可用的所有文件。注意:您需要确保在连接字符串变量(即 \\networkpath\filename.csv)
中包含完全限定的域名 (FQDN)