Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何找到一个由5个数字组成的变量集,这些数字由周围的下划线限定?_C#_Sql Server_Regex_Ssis_Etl - Fatal编程技术网

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]
    作为ReadWriteVariable
  • 在脚本任务内部,请使用以下代码:

    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;
    }
    

  • 他们正在寻找一个由下划线包围的五位数字。像这样,我同意。但是这两个正则表达式都有效,但是我把你提供的正则表达式添加到了我的回答中。我刚刚看到第一行,你提到了下划线之间的四个数字,并认为你误解了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;
    }