2

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

我遇到的问题是组部分充满了很多垃圾,例如我得到了这样的东西:

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

这是一个非常短的(有些超过 3000 个字符)。我想从中提取的部分是行为标准和 ManagementLevel-9。我说这是半随机的,因为显然不是每个人都属于同一组,而且我不相信他们都处于相同的顺序。

组总是紧跟在 |CN= 之后,第一个出现的地方没有 | 在前面它只是CN =。

我试过类似的东西:

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

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

谢谢

4

1 回答 1

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();

这是另一个版本(非控制台),它在 a 中捕获结果,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 包中使用它,您将添加一个脚本组件作为转换,然后在 Input Columns 选项卡上,选中与该字段对应的框,即 distinctname 并指示它是 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);

不要忘记添加对正则表达式程序集的引用using System.Text.RegularExpressions;

于 2012-10-23T18:00:23.257 回答