3

次のような内容のファイルがあります。

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

ファイルが大きすぎて、文字列だけに読み込むことができません。

各要素が単語である文字列の Traversable に分割する最も簡単な方法は何ですか?

重要な場合: ファイルのコンテンツは単一の文字列に収まりませんが、結果の Traversable は問題なくリストになる可能性があります。

4

3 に答える 3

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
  }
}
于 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))

これにより、イテレータが得られます。eg を使用して、いつでもリストに変換できます.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 に答える