C# 如何找到一个由5个数字组成的变量集,这些数字由周围的下划线限定?
我正在将文件名拉入一个变量(C# 如何找到一个由5个数字组成的变量集,这些数字由周围的下划线限定?,c#,sql-server,regex,ssis,etl,C#,Sql Server,Regex,Ssis,Etl,我正在将文件名拉入一个变量(@[User::FileName]),并尝试从该字符串中提取工单编号(总是5个数字,两边都有下划线)。例如,文件名类似于-“ABC_2017_DEF_9_12_GHI_35132_S5160.csv”。我希望结果返回“35132”。我已经找到了一些例子,比如这个子字符串(FileName,1,FINDSTRING(FileName,“,”,1)-1),但是下划线并不总是在同一个位置 是否可以在表达式生成器中执行此操作 答复: 我会使用脚本转换(或者脚本任务,如果它不在
@[User::FileName]
),并尝试从该字符串中提取工单编号(总是5个数字,两边都有下划线)。例如,文件名类似于-“ABC_2017_DEF_9_12_GHI_35132_S5160.csv”
。我希望结果返回“35132”。我已经找到了一些例子,比如这个子字符串(FileName,1,FINDSTRING(FileName,“,”,1)-1)
,但是下划线并不总是在同一个位置
是否可以在表达式生成器中执行此操作
答复:
我会使用脚本转换(或者脚本任务,如果它不在数据流中)并使用正则表达式来实现这一点。其他部分有什么意义吗 无论如何,您可以使用脚本任务和分割函数 将@fileName作为readonly传入,@WO作为readwrite传入
string fn = Dts.Variables["fileName"].Value;
string[] parts = fn.Split('_');
//Assuming it's always the 7th part
// You could extract the other parts as well.
Dts.Variables["WO"].Value = part(6);
首先,您提供的示例
ABC_2017_DEF_9_12_GHI_35132_S5160。csv
包含4个位于下划线之间的数字:
2017 , 9 , 12 , 35132
我不知道文件名是否包含多个数字,一个5位数的数字可能会出现很多次,因此在我的回答中,我将假设您要返回的数字是由5位数组成的数字的最后一次出现
解决方案
必须使用以下正则表达式:
(?:_)\K[0-9][0-9][0-9][0-9][0-9](?=_)
或者根据建议(在注释中),您可以使用以下正则表达式:
_([\d]{5})_
在SSIS中实现正则表达式
@[User::FileNumber]
)@[User::Filename]
变量作为ReadOnlyVariable,选择@[User:FileNumber]
作为ReadWriteVariableusing System.Text.RegularExpressions;
public void Main()
{
string strFilename = Dts.Variables["filename"].Value.ToString();
string strNumber;
var objRegEx = new Regex(@"(?:_)\K[0-9][0-9][0-9][0-9][0-9](?=_)");
var mc = objRegEx.Matches(strFilename);
//The last match contains the value needed
strNumber = mc[mc.Count - 1].Value;
Dts.Variables["FileNumber"].Value.ToString();
Dts.TaskResult = (int)ScriptResults.Success;
}
他们正在寻找一个由下划线包围的五位数字。像这样,我同意。但是这两个正则表达式都有效,但是我把你提供的正则表达式添加到了我的回答中。我刚刚看到第一行,你提到了下划线之间的四个数字,并认为你误解了Q。正则表达式中的
\K
是什么?你们太棒了!!这正是我想做的!非常感谢你!我会为此奋斗一整天,也不会有任何进展!你有没有什么好的资源可以推荐我学习这些东西?我对SSIS软件包来说是相当新的(3个月),但是在编程方面有一个与C++和java有关的联合学位,所以我并没有完全迷失,但可以学到更多的东西。@ Hadi不幸的是我仍然无法得到那个运行…(我确实在objRegEx之前删除了“New”,因为它不应该在那里)。但我确实把你和Martin Smith的代码混合在一起,得到了一个有效的解决方案!我不知道你写的那封信还发生了什么。我想不出那个。。。我把我的答案添加到问题的顶部。
using System.Text.RegularExpressions;
public void Main()
{
string strFilename = Dts.Variables["filename"].Value.ToString();
string strNumber;
var objRegEx = new Regex(@"(?:_)\K[0-9][0-9][0-9][0-9][0-9](?=_)");
var mc = objRegEx.Matches(strFilename);
//The last match contains the value needed
strNumber = mc[mc.Count - 1].Value;
Dts.Variables["FileNumber"].Value.ToString();
Dts.TaskResult = (int)ScriptResults.Success;
}