我只想读以特定正则表达式开头的行。
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,但是这会返回一个字符串,而不是一个布尔值,我不能在过滤器函数中使用这个字符串。
任何帮助都将不胜感激。
发布于 2017-09-27 09:21:56
其他的答案是-考虑过了。只需使用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")发布于 2017-09-27 09:12:00
我找到了我问题的答案。
命令需要如下所示。
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 )发布于 2017-09-27 09:14:19
您可以使用findFirstMatchIn方法尝试查找Regex的匹配,该方法返回一个Option[Match]
spark.read.textFile(file.path).filter { line =>
line.nonEmpty &&
line.length > 1 &&
"regex".r.findFirstMatchIn(line).isDefined
}https://stackoverflow.com/questions/46443517
复制相似问题