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

使用C#正则表达式匹配文本文件特定模式及模式序列的技术咨询

嘿,咱完全懂这种久别C#又要临时搞SSIS脚本的手生感!针对你要做的「遍历文本文件→按模式/序列提取合同号、银行号等字段→输出到文本」需求,我给你整理了一套接地气的实现思路和代码示例,应该能帮你快速搞定:

一、核心实现步骤拆解

1. 先搭好SSIS脚本任务的基础框架

打开SSIS的脚本任务编辑器,选择C#作为脚本语言,然后在脚本里先引入必要的命名空间:

using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;

另外记得把你的输入文件目录、输出文件路径这些参数,通过SSIS变量传递进来(脚本任务的「ReadOnlyVariables」或「ReadWriteVariables」配置),这样后期改路径不用改代码。

2. 遍历目标文本文件

用Directory.EnumerateFiles来遍历指定目录下的所有目标文本文件(可以加后缀过滤,比如只找.txt),避免一次性加载所有文件路径占内存:

string inputDir = Dts.Variables["User::InputDirectory"].Value.ToString();
string outputPath = Dts.Variables["User::OutputFilePath"].Value.ToString();

// 遍历所有txt文件
foreach (string filePath in Directory.EnumerateFiles(inputDir, "*.txt"))
{
    ProcessSingleFile(filePath, outputPath);
}

3. 用正则+序列匹配提取关键值

这里分两种场景处理:

场景1:直接匹配行内的固定模式

比如每行里明确有「合同编号:XXX」「银行编号:XXX」这种格式,直接写正则捕获组提取:

// 定义正则规则,括号里的是要捕获的内容
Regex contractRegex = new Regex(@"合同编号:(\d{10})", RegexOptions.IgnoreCase);
Regex bankRegex = new Regex(@"银行编号:(\w{6})", RegexOptions.IgnoreCase);

// 逐行读取文件(大文件友好)
foreach (string line in File.ReadLines(filePath))
{
    Match contractMatch = contractRegex.Match(line);
    if (contractMatch.Success)
    {
        string contractNo = contractMatch.Groups[1].Value;
        // 存到临时变量里
    }

    Match bankMatch = bankRegex.Match(line);
    if (bankMatch.Success)
    {
        string bankNo = bankMatch.Groups[1].Value;
        // 存到临时变量里
    }
}

场景2:按模式序列提取(比如先找表头行,再取下一行的值)

如果你的文本是「合同编号」一行,下一行是具体值这种结构,可以用状态标记来处理:

bool waitForContractNo = false;
bool waitForBankNo = false;
string contractNo = string.Empty;
string bankNo = string.Empty;

foreach (string line in File.ReadLines(filePath))
{
    if (line.Trim() == "合同编号")
    {
        waitForContractNo = true;
        continue;
    }
    if (waitForContractNo)
    {
        contractNo = line.Trim();
        waitForContractNo = false;
        continue;
    }

    if (line.Trim() == "银行编号")
    {
        waitForBankNo = true;
        continue;
    }
    if (waitForBankNo)
    {
        bankNo = line.Trim();
        waitForBankNo = false;
        continue;
    }
}

4. 输出结果到目标文本文件

把提取到的合同号、银行号等信息,按你需要的格式(比如CSV或自定义分隔符)写入输出文件,记得用File.AppendText避免覆盖之前的结果:

using (StreamWriter sw = File.AppendText(outputPath))
{
    // 比如按「文件名,合同编号,银行编号」格式写入
    sw.WriteLine($"{Path.GetFileName(filePath)},{contractNo},{bankNo}");
}
二、实用小提示
  • 正则规则可以先在本地测试(比如用VS的即时窗口,或者随便写个小控制台程序跑一遍),确保能准确捕获目标值;
  • 如果处理超大文件,一定要用File.ReadLines逐行读取,别用File.ReadAllLines一次性加载到内存;
  • 可以给提取到的值加一些校验逻辑(比如合同号长度是否符合要求),避免脏数据输出;
  • SSIS脚本任务里如果要调试,可以用Dts.Events.FireInformation输出日志,方便排查问题。

内容的提问来源于stack exchange,提问作者SQLcommando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:47:11