只读以特定正则表达式开头的行

时间:2017-09-27 08:54:22

标签: scala apache-spark

我想只读取以特定正则表达式开头的行。

 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,但这会返回一个字符串,而不是一个布尔值,我不能在过滤函数中使用

任何帮助都将不胜感激。

3 个答案:

答案 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
}