3

我有一个文件,内容如下:

"Some","Words","separated","by","comma","and","quoted","with","double","quotes"

文件太大,只能在字符串上读取。

将其拆分为可遍历的字符串的最简单方法是什么,每个元素都是一个单词?

如果它很重要:虽然文件的内容不适合单个字符串,但生成的 Traversable 可能是一个没有问题的列表。

4

3 回答 3

1

这是一个使用stringLitrepsep来自 Scala 解析器组合器的版本。不过,我不会保证它的效率。

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
  }
}
于 2012-10-05T12:55:38.227 回答
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

于 2012-10-05T16:10:57.450 回答
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
}
于 2012-10-05T12:52:03.420 回答