我想只读取以特定正则表达式开头的行。
val rawData = spark.read.textFile(file.path).filter(f => f.nonEmpty && f.length > 1 && f.startsWith("("))
是我到目前为止所做的。
现在我发现我的条目以:
(W); 27536-或(W)28325-(分离器后5位数)
我只想读取以(W)开头的行; 1234-(分隔符后4位数)
将捕获此类似的正则表达式:\(\D\)(;|\s)\d{4}
表示布尔返回,或\(\D\)(;|\s)\d{4}-.*
表示字符串匹配返回
我现在的问题是我不知道如何在read.textFile命令中包含正则表达式
f.startswith仅适用于字符串
f.matches也只适用于字符串
我也尝试过使用http://www.scala-lang.org/api/2.12.3/scala/util/matching/Regex.html,但这会返回一个字符串,而不是一个布尔值,我不能在过滤函数中使用
任何帮助都将不胜感激。
答案 0 :(得分:2)
其他答案都在考虑这个问题。只需使用matches
val lineRegex = """\(\D\)(;|\s)\d{4}-.*"""
val ns = List ("(W);1234-something",
"(W);12345-something",
"(W);2345-something",
"(W);23456-something",
"(W);3456-something",
"",
"1" )
ns.filter(f=> f.matches(lineRegex))
结果
List("(W);1234-something", "(W);2345-something", "(W);3456-something")
答案 1 :(得分:1)
我找到了问题的答案。
命令需要看起来像这样。
val lineregex = """\(\D\)(;|\s)\d{4}-.*""".r
val rawData = spark.read.textFile(file.path)
.filter(f => f.nonEmpty && f.length > 1 && lineregex.unapplySeq(f).isDefined )
答案 2 :(得分:0)
您可以尝试使用findFirstMatchIn
方法查找正则表达式的匹配项,该方法返回Option[Match]
:
spark.read.textFile(file.path).filter { line =>
line.nonEmpty &&
line.length > 1 &&
"regex".r.findFirstMatchIn(line).isDefined
}