从一个半随机字符串中提取多个子字符串

时间:2012-10-23 17:42:29

标签: ssis

我正在处理我公司的广告转储。我获得了用户名,名称和组。我的最终目标是定期转储csv文件,我的SSIS包抓住它,从组中删除所有垃圾,然后从中提取报告,以便用户可以搜索某人的名称或用户名将列出他们所属的组。

我遇到的问题是,群组部分充满了大量垃圾,例如我给出了类似的内容:

CN=Standards of Conduct,CN=Users,DC=rlhk,DC=local|CN=ManagementLevel-9,OU=Groups,OU=rem,DC=rlhk,DC=local

这是一个非常短的(有些超过3000个字符)。我要提取的部分是行为准则和管理级别9。我说这是半随机的,因为显然不是每个人都属于同一个群体,我不相信他们都是在同一个顺序。

该组始终紧跟在| CN =之后,第一次出现时没有|在前面它只是CN =。

我尝试过类似的事情:

SUBSTRING(Groups,FINDSTRING(Groups,"|CN=",1 ) + 3,FINDSTRING(Groups,",",1) - 4)

然而,它只是“| CN =”的第一次迭代显然,我不知道如何获得所有这些。

谢谢

1 个答案:

答案 0 :(得分:1)

如果符合您列出的规则,下面的正则表达式代码将与您的论坛匹配。正则表达式将在输入字符串中搜索CN =的所有实例,然后搜索所有内容,直到逗号。

    string groupString = "CN=Standards of Conduct,CN=Users,DC=rlhk,DC=local|CN=ManagementLevel-9,OU=Groups,OU=rem,DC=rlhk,DC=local";
    foreach (Match match in Regex.Matches(groupString , @"CN=([^,]*)"))
    {
        Console.WriteLine(match.Groups[1].Value);
    }
    Console.ReadLine();

这是另一个版本(非控制台),它在List<string>中捕获结果,因此您可以迭代它或者检查其中是否包含特定值:

        string groupString = "CN=Standards of Conduct,CN=Users,DC=rlhk,DC=local|CN=ManagementLevel-9,OU=Groups,OU=rem,DC=rlhk,DC=local";
        List<string> matchedGroups = new List<string>();
        foreach (Match match in Regex.Matches(groupString , @"CN=([^,]*)"))
        {
            matchedGroups.Add(match.Groups[1].Value);
        }
        //Use the matchedGroups collection here

要在SSIS包中使用它,您将脚本组件添加为转换,然后在“输入列”选项卡上,选中与该字段对应的框,即distinguishedname,并指明它是ReadWrite。

    foreach (Match match in Regex.Matches(Row.distinguishedname, @"CN=([^,]*)"))
    {
        Row.distinguishedname = (match.Groups[1].Value);
    }

如果要成为新列,则需要进入“输入和输出”选项卡,展开“输出0”,选择“输出列”,单击“添加列”,然后为其提供新名称和数据类型(simplifiedName,DT_STR) 3000代码页1252)。然后我们将上面的行改为

        Row.simplifiedName = (match.Groups[1].Value);

不要忘记添加对RegularExpressions程序集using System.Text.RegularExpressions;

的引用