【发布时间】:2019-05-17 03:31:12
【问题描述】:
这是从我编写的代码中获得的内容的演示。我正在使用 Source.fromFile(filePath) 懒惰地读取文件并使用 .getLines() 方法将每一行读取为字符串并对其进行迭代以查找其中是否出现某个单词/模式。
让我们将要匹配的模式视为“.read”。 .如果整个模式出现在同一行, line.contains(".read.") 就可以了。 如果它以下列任何一种方式传播到后续行,就会出现问题:
.
read.
或
.
read
.
或
.read
.
我什至无法在 List[String] 中收集文件的全部内容,因为内存消耗太大以至于无法通过使用索引连接上一行或下一行,因为它是一个 bufferedSource 迭代器正在使用。
val bufferedSource = Source.fromFile("C:/code.scala")
val key = ".read."
var lineCounter = 0
for (bufferedline <- bufferedSource.getLines()) {
lineCounter+=1
val line = bufferedline.trim
if (line.length() != 0) {
if(line.contains(".read."))
println("Found pattern at : "+lineCounter)
}
}
当模式分布在多个字符串而不是由 newLine 字符分隔的单个字符串时,我不确定如何合并更改。任何有关如何解决此类问题的帮助将不胜感激。
注意 - 如果要匹配的模式分布在 3 行中,这只是一个简单的示例,但是如果要找到特定字符串说“spark.read.option”并且它分布在 5 个不同的行。
【问题讨论】:
-
你想对比赛做什么?数他们?从文件数据中删除它们?您正在寻找的模式总是一个具体的字符串还是可能是一个正则表达式模式?如果模式可以拆分为换行符,是否也可以拆分为其他空白字符或多个换行符?
-
我想找到正在读取的文件中出现这些特定匹配项的行号。它也可能是一个正则表达式模式。该模式将始终仅在换行符之间拆分,因为我通过修剪每一行作为 rea 来处理空格 m,如果有多个新行,我将条件放在 line.length! =0。但是,是的,换行符之后也可以有多个换行符和空格。
-
像
a.z这样的正则表达式模式将匹配abz和axz,但它不会匹配ab\nz。因此,除非正则表达式模式考虑了内部任何地方可能存在的换行符,并且所有 5 个文本行都已被读取和缓冲,否则将无法找到拆分为 5 行文本的目标字符串,这会使您不将所有内容都吸入内存的目标变得复杂。跨度>