You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SSIS中按年份创建压缩文件

实现SSIS按年份分组压缩文件

解决方案思路

  1. 遍历源文件夹中符合filename_YYYYMM.txt格式的文件
  2. 提取文件名中的年份(YYYY部分)进行分组
  3. 针对每个年份组,创建对应名称的压缩包并添加组内文件
  4. 替换原有批量压缩逻辑,改为精准筛选后的分组压缩

配置与代码修改

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 00:07:29