我需要在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' 不能用作列类型。
答案 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();
}