如何在SSIS中按年份创建压缩文件
实现SSIS按年份分组压缩文件
解决方案思路
- 遍历源文件夹中符合
filename_YYYYMM.txt格式的文件 - 提取文件名中的年份(YYYY部分)进行分组
- 针对每个年份组,创建对应名称的压缩包并添加组内文件
- 替换原有批量压缩逻辑,改为精准筛选后的分组压缩
配置与代码修改
1. 脚本任务引用配置
在Script Task的编辑界面,切换到References标签,勾选System.IO.Compression和System.IO.Compression.FileSystem两个引用,确保压缩相关API可用。
2. 修改后的完整脚本
using System; using System.IO; using System.IO.Compression; using System.Linq; using Microsoft.SqlServer.Dts.Runtime; public class ScriptMain { public void Main() { try { // 获取SSIS变量值 string srcFolder = Dts.Variables["User::VarInputFolder"].Value.ToString(); string destFolder = Dts.Variables["User::VarOutputFolder"].Value.ToString(); // 确保输出文件夹存在 if (!Directory.Exists(destFolder)) { Directory.CreateDirectory(destFolder); } // 筛选符合格式的文件:以filename_开头,后缀为.txt,中间包含6位数字(YYYYMM) var targetFiles = Directory.GetFiles(srcFolder, "filename_*.txt") .Where(file => { string fileName = Path.GetFileNameWithoutExtension(file); // 拆分文件名,提取YYYYMM部分 string[] parts = fileName.Split('_'); return parts.Length == 2 && parts[1].Length == 6 && int.TryParse(parts[1], out _); }) .GroupBy(file => { // 提取年份:取YYYYMM的前4位 string fileName = Path.GetFileNameWithoutExtension(file); string yyyymm = fileName.Split('_')[1]; return yyyymm.Substring(0, 4); }); // 遍历每个年份组,生成对应压缩包 foreach (var yearGroup in targetFiles) { string zipPath = Path.Combine(destFolder, $"Filename_{yearGroup.Key}.zip"); // 如果压缩包已存在,先删除(可选,根据需求调整) if (File.Exists(zipPath)) { File.Delete(zipPath); } // 创建压缩包并添加文件 using (ZipArchive archive = ZipFile.Open(zipPath, ZipArchiveMode.Create)) { foreach (string file in yearGroup) { string entryName = Path.GetFileName(file); archive.CreateEntryFromFile(file, entryName, CompressionLevel.Optimal); } } } Dts.TaskResult = (int)ScriptResults.Success; } catch (Exception ex) { // 捕获异常并写入SSIS日志 Dts.Events.FireError(0, "按年份压缩脚本", ex.Message + "\n" + ex.StackTrace, string.Empty, 0); Dts.TaskResult = (int)ScriptResults.Failure; } } enum ScriptResults { Success = 0, Failure = 1 } }
关键说明
- 文件筛选逻辑:通过
Directory.GetFiles匹配filename_*.txt,再验证文件名格式确保包含有效的YYYYMM部分 - 分组逻辑:按文件名中提取的4位年份进行分组,保证同一年份的文件进入同一个压缩包
- 压缩包创建:使用
ZipArchive逐个添加文件,替代原有的CreateFromDirectory,避免压缩整个文件夹 - 异常处理:添加异常捕获并写入SSIS错误日志,方便排查问题
- 可选配置:如果需要保留已存在的压缩包,可删除
File.Delete(zipPath)代码块
内容的提问来源于stack exchange,提问作者Sravani
相关产品推荐
相关产品推荐

