使用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
相关产品推荐
相关产品推荐

