【问题标题】:Load latest flat files via SSIS通过 SSIS 加载最新的平面文件
【发布时间】:2018-10-07 12:48:16
【问题描述】:

我必须将 2 个平面文件加载到 SQL Server 表中。平面文件被加载到一个文件夹中。它有数千个其他文件。如果它是具有不同日期的同一个文件,我会使用 foreach 循环并完成它..但这是场景。

我要加载的文件名如下:

  • Non_Payment_Stat_Data1_12_2017.txt
  • Payment_Stat_Data1_12_2017.txt

  • 文件每天加载

  • 我需要将上面的文件类型加载到表中(选择日期加载)

还有许多其他文件,其中一些是Payment_Stat_DataNon_Payment_Stat_Data,末尾没有日期部分。我们不想将这些加载到表中。

我尝试使用脚本任务 c# 代码,它给了我最新的文件,但不是我们想要加载的文件。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.IO;

namespace ST_2650e9fc7f2347b2826459c2dce1b5be.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {
        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion

        public void Main()
        {
            // TODO: Add your code here
            var directory= new DirectoryInfo(Dts.Variables["User::VarFolderPath"].Value.ToString());

            FileInfo[] files = directory.GetFiles();
            DateTime lastModified = DateTime.MinValue;

            foreach (FileInfo file in files)
            {
                if (file.LastWriteTime > lastModified)
                {
                    lastModified = file.LastWriteTime;
                    Dts.Variables["User::VarFileName"].Value = file.ToString();
                }
            }

            MessageBox.Show(Dts.Variables["User::VarFileName"].Value.ToString());

            Dts.TaskResult = (int)ScriptResults.Success;
        }
    }
}

来源:http://www.techbrothersit.com/2013/12/ssis-how-to-get-most-recent-file-from.html

代码有效,但提供了另一个最新的平面文件。我只想提取 Non_Payment_Stat_Data1_12_2017.txtPayment_Stat_Data1_12_2017.txt 文件。他们每天都会更改日期。

【问题讨论】:

  • 你的问题有点混乱。你说你想获取最新的文件,但是当你这样做时,它不是你想要的文件。然后你提到几个静态文件名并说你总是想选择那些文件。是哪个?
  • 这两个看起来像 Non_Payment_Stat_Data1_12_2017 和 Payment_Stat_Data1_12_2017 这样的静态文件实际上每天都在变化,即日期部分每天都在变化,我们想每天抓取这两个具有新日期的文件并加载。例如,当上述 2 个文件的日期为 1_13_2017 时,我们加载它们并忽略旧文件(不重新加载它们)
  • 那么,如果您可以预测文件的名称,为什么不这样做呢?
  • 我不明白。是的,文件名保持不变,但日期发生了变化,所有旧的平面文件仍然在同一个文件夹中,我们只想加载上述两种类型的新文件。
  • 使用表达式来构建基于日期的文件名。但这通常是个坏主意。你应该编写你的包,使它在任何天都能正常工作,即使你为一个已经加载的文件运行它。

标签: sql-server tsql ssis


【解决方案1】:

如果文件是根据今天的日期以可预测的方式命名的(您似乎是这样说的),那么只需在平面文件连接管理器中使用 expression 作为文件名。

【讨论】:

  • 我是一名初级数据分析师而不是高级编码员,我的经理提出了要求并希望完成这项工作,上面的示例表达式会有所帮助
  • 我提供的链接中有示例。 Stack Overflow 不是程序员免费工作的网站。如果要求高于您的技能水平,您的经理应该聘请一名程序员。
  • 其实很幸运在这里找到了类似的场景,修复了我的问题。stackoverflow.com/questions/6922517/…
  • 如果我误解了stackoverflow的目的,我认为这是一个免费的分享网站。我会感谢你的链接,我在我的手机上没有看到。。务实的网站似乎真的有有用的样本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2015-01-22
  • 1970-01-01
  • 2017-10-27
  • 2017-03-10
相关资源
最近更新 更多