【问题标题】:SSIS dynamic flat file connection to load daily file with date-time,minute,second timestampSSIS 动态平面文件连接以加载带有日期时间、分钟、秒时间戳的每日文件
【发布时间】:2019-05-12 16:24:24
【问题描述】:

我必须从网络位置加载每日 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()))+"_10_00.csv"

有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: visual-studio ssis etl flat-file dts


    【解决方案1】:

    您可以使用 foreach 循环文件枚举器并应用以下文件规范表达式:

    DS_All_users_with_additional_fields*.csv

    * 服务器作为通配符,将选择与该字符串匹配的所有文件。您可以使用它以使其根据您的需要灵活。在这种情况下,作业将扫描与上述字符串匹配的特定文件夹中的所有可用文件。然后可以将其分配给一个变量,您可以使用该变量来动态设置连接字符串。

    我认为您不能将* 添加到连接字符串本身中。

    更新

    要设置连接管理器的连接字符串属性,请参见下图。值得注意的是,此解决方案将改变工作流程。您最初的工作流程是告诉连接管理器要专门寻找什么文件。但是,通过实现 foreach 循环,该作业现在正在搜索特定文件夹路径中可用的所有文件。注意:您需要确保在连接字符串变量中包含完全限定域名 (FQDN)(即 \\networkpath\filename.csv)

    【讨论】:

    • 感谢您的回复。你能告诉我如何创建一个连接字符串变量吗?我的文件在提取时使用带有分钟和秒的日期时间戳导出。如何使平面文件连接足够动态以每天使用它?
    【解决方案2】:

    您需要导入的文件是该目录中唯一名称以DS_All_users_with_additional_fields_ 开头的文件吗?如果是这样,请使用脚本任务查找最近的任务,并将连接字符串中使用的变量设置为此名称。以下示例使用LINQ 查找以您列出的名称开头的文件,然后按创建日期对其进行排序,并返回第一个文件的名称。下面的Name 属性将包含扩展名。您还可以通过将其更改为FullName 属性来获取完整的文件路径,在这种情况下,您可以只将此值用于平面文件连接字符串使用的变量,而不是将其与@[User::DataLoadDir] 变量连接。此示例确实引用了System.IOSystem.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;
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      • 2020-12-27
      • 2015-01-02
      相关资源
      最近更新 更多