我有一个包含这样内容的文件:
"Some","Words","separated","by","comma","and","quoted","with","double","quotes"
文件很大,只能在String上读取它。
将它分成Traversable of Strings的最简单方法是什么,每个元素都是一个单词?
如果重要:虽然文件的内容不适合单个String,但生成的Traversable可能是一个没有问题的List。
答案 0 :(得分:1)
以下是使用Scala解析器组合器中的stringLit
和repsep
的版本。不过,我不会保证它的效率。
import scala.util.parsing.combinator.syntactical.StdTokenParsers
import scala.util.parsing.combinator.lexical.StdLexical
import scala.util.parsing.input.StreamReader
import java.io.FileReader
object P extends StdTokenParsers {
type Tokens = StdLexical
val lexical = new StdLexical
lexical.delimiters += ","
def words : Parser[List[String]] = repsep(stringLit, ",")
def getWords(fileName : String) : List[String] = {
val scanner = new lexical.Scanner(StreamReader(new FileReader(fileName)))
// better error handling wouldn't hurt.
words(scanner).get
}
}
答案 1 :(得分:1)
这是对您自己的解决方案的改编,使用JavaConversions
将Java迭代器作为Scala操作。
import java.util.Scanner
import java.io.File
import scala.collection.JavaConversions._
val scanner = new Scanner(new File("...")).useDelimiter(",")
scanner.map(_.trim).map(quoted => quoted.substring(1, quoted.length - 1))
这为您提供了一个迭代器。您始终可以使用以下方式将其转换为列表: .toList
。
答案 2 :(得分:0)
我使用java.util.Scanner做了它,虽然它确实有效,但我还是会欣赏更多的scalaesc版本。
val scanner = new Scanner(new File("""bigFile.txt""")).useDelimiter(",")
var wordList: Vector[String] = Vector()
while (scanner.hasNext()) {
val quoted = scanner.next()
val word = quoted.replace("\"", "")
wordList = wordList :+ word
}