正则表达式匹配U-SQL

时间:2018-03-25 11:19:36

标签: regex u-sql

我需要在U-SQL中写一个帮助,根据正则表达式输出将记录输出到两个不同的文件。 让我详细解释一下我的情景。

让我们假设我的输入文件有两列," Name"和人员识别号码(" PIN"):

Name , PIN
John ,12345
Harry ,01234
Tom, 24659

我的PIN条件是它应该从1或2开始。在上述情况下,记录1& 3有效,记录2无效。

我需要输出记录1& 3到我的输出处理文件,2到我的错误文件

如何执行此操作,还可以使用Regex.Match验证正则表达式吗?

//posting my code

@person =
EXTRACT UserId          int,
         PNR     string,
         UID String,
FROM "/Samples/Data/person.csv"
USING Extractors.csv();

@rs1=select UserId,PNR,UID,Regex.match(PNR,'^(19|20)[0-9]{2}((0[1-9])$') as pnrval,Regex.match(UID,'^(19|20)[0-9]{2}$') as uidval
from @person

@rs2 = select UserId,PNR,UID from @rs1 where pnrval=true or uidval=true
@rs3 = select UserId,PNR,UID from @rs1 where uidval=false or uidval= false

OUTPUT @rs2   
    TO "/output/sl.csv"
      USING Outputters.Csv();

OUTPUT @rs3   
    TO "/output/error.csv"
      USING Outputters.Csv();

但是我收到了这个错误:

  

严重级代码说明项目文件行抑制状态错误   E_CSC_USER_INVALIDCOLUMNTYPE:' System.Text.RegularExpressions.Match'   不能用作列类型。

3 个答案:

答案 0 :(得分:1)

@person =
EXTRACT UserId          int,
         PNR     string,
         UID String,
FROM "/Samples/Data/person.csv"
USING Extractors.csv();

@rs1=select UserId,PNR,UID,Regex.Ismatch(PNR,'^(19|20)[0-9]{2}((0[1-9])$') as pnrval,Regex.Ismatch(UID,'^(19|20)[0-9]{2}$') as uidval
from @person

@rs2 = select UserId,PNR,UID from @rs1 where pnrval=true or uidval=true


@rs3 = select UserId,PNR,UID from @rs1 where pnrval=false or uidval= false

OUTPUT @rs2   
    TO "/output/sl.csv"
      USING Outputters.Csv();

OUTPUT @rs3   
    TO "/output/error.csv"
      USING Outputters.Csv();

这符合我的要求。感谢您的支持和建议

答案 1 :(得分:1)

@someData =
SELECT * FROM
    ( VALUES
    ("John", "12345"),
    ("Harry", "01234"),
    ("Tom", "24659")
    ) AS T(Name, pin);

@result1 =
    SELECT Name,
        pin
    FROM @someData
    WHERE pin.StartsWith("1") OR pin.StartsWith("2");

@result2 =
    SELECT Name,
        pin
    FROM @someData
    WHERE !pin.StartsWith("1") AND !pin.StartsWith("2");

答案 2 :(得分:0)

考虑到您的输入,我会使用

.*\s*,\s*[12]\d+
  • .*匹配任意数量的字符,并且需要匹配逗号之前的所有内容
  • \s*,\s*匹配任意数量的空格(或\s匹配空白)前面和后面的逗号
  • [12]匹配单个数字,等于1或2;这符合您对PIN的要求
  • \d+匹配一个或多个数字

现场演示here

至于使用Regex.Match,我会在StackOverflow上引用this answer

  

System.Text.RegularExpressions.Match不是内置U-SQL类型的一部分。

所以我在这里要做的是在C#中预解析你的CSV;类似的东西:

        Regex CurrentRegex = new Regex(@".*\s*,\s*[12]\d+", RegexOptions.IgnoreCase);

        foreach (var LineOfText in File.ReadAllLines(InputFilePath))
        {
            Match CurrentMatch = CurrentRegex.Match(LineOfText);
            if (CurrentMatch.Success)
            {
                // Append line to success file
            }
            else
            {
                // Append line to error file
            }
            CurrentMatch = CurrentMatch.NextMatch();
        }