如何使用SSIS复制并重命名最新带时间戳的CSV文件
实现步骤(SSIS 处理带时间戳的CSV文件)
1. 预定义变量
先在SSIS包的变量面板创建以下变量(作用域设为包级别):
SourceFolder(字符串):Folder A的完整路径,例:C:\Data\FolderATargetFolder(字符串):Folder B的完整路径,例:C:\Data\FolderBFilePrefixes(字符串数组):存储3个文件的统一前缀,例:{"Sales_", "Inventory_", "Customers_"}CurrentPrefix(字符串):循环时存储当前处理的文件前缀LatestFilePath(字符串):存储找到的对应前缀的最新文件路径TargetFileName(字符串):存储去掉时间戳后的目标文件完整路径
2. 循环遍历每个文件前缀
添加Foreach循环容器,配置如下:
- 枚举器类型选择「Foreach From Variable Enumerator」
- 变量选择
User::FilePrefixes - 在「变量映射」里,将索引0映射到
User::CurrentPrefix,实现逐个遍历3个文件前缀
3. 筛选对应前缀的最新文件
在Foreach容器内添加脚本任务,用来定位最新文件:
- 只读变量勾选:
User::SourceFolder, User::CurrentPrefix - 读写变量勾选:
User::LatestFilePath - 编辑脚本(C#示例):
using System.IO; using System.Linq; public void Main() { string sourceDir = Dts.Variables["User::SourceFolder"].Value.ToString(); string prefix = Dts.Variables["User::CurrentPrefix"].Value.ToString(); // 获取前缀匹配的所有CSV文件,按最后修改时间倒序排序 var matchedFiles = Directory.GetFiles(sourceDir, $"{prefix}*.csv") .OrderByDescending(f => File.GetLastWriteTime(f)) .ToList(); if (matchedFiles.Any()) { Dts.Variables["User::LatestFilePath"].Value = matchedFiles.First(); } else { // 无匹配文件时抛出警告,可根据需求调整逻辑 Dts.Events.FireWarning(0, "FindLatestFile", $"未找到前缀为{prefix}的CSV文件", "", 0); } Dts.TaskResult = (int)ScriptResults.Success; }
4. 生成去时间戳的目标文件名
在脚本任务后添加第二个脚本任务,处理文件名:
- 只读变量勾选:
User::LatestFilePath, User::CurrentPrefix, User::TargetFolder - 读写变量勾选:
User::TargetFileName - 编辑脚本(根据你的时间戳格式调整,示例为
前缀_时间戳.csv):
using System.IO; public void Main() { string fullSourcePath = Dts.Variables["User::LatestFilePath"].Value.ToString(); string prefix = Dts.Variables["User::CurrentPrefix"].Value.ToString(); string targetDir = Dts.Variables["User::TargetFolder"].Value.ToString(); // 提取前缀+后缀生成目标文件名(跳过时间戳部分) string targetFileName = $"{prefix.Substring(0, prefix.Length - 1)}.csv"; Dts.Variables["User::TargetFileName"].Value = Path.Combine(targetDir, targetFileName); // 如果时间戳是下划线分隔(例:Sales_20240520_1030.csv),可改用Split逻辑: // string fileName = Path.GetFileName(fullSourcePath); // string cleanName = $"{fileName.Split('_')[0]}.csv"; // Dts.Variables["User::TargetFileName"].Value = Path.Combine(targetDir, cleanName); Dts.TaskResult = (int)ScriptResults.Success; }
5. 复制文件到目标文件夹
在第二个脚本任务后添加文件系统任务:
- 操作选择「复制文件」
- 源连接选择
User::LatestFilePath - 目标连接选择
User::TargetFileName - 勾选「覆盖目标文件」(确保最新文件能替换旧版本)
6. 定时调度
用SQL Server代理创建作业,设置每小时执行一次该SSIS包,实现自动定时处理。
注意事项
- 确保SSIS执行账户对Folder A和Folder B有完整的读写权限
- 测试时可手动生成不同时间戳的文件,验证脚本是否能正确筛选最新文件
- 若时间戳格式有变化,只需调整第二个脚本任务中的字符串处理逻辑即可
内容的提问来源于stack exchange,提问作者Shivendra Rai
相关产品推荐
相关产品推荐

