我有內容的文件是這樣的:如何分割一個文件源轉換爲字符串或單詞
"Some","Words","separated","by","comma","and","quoted","with","double","quotes"
文件是大讀取到只是字符串。
什麼是最簡單的方法分裂成一個Traversable的字符串,每個元素是一個單詞?
如果很重要:雖然文件的內容不適合單個字符串,但生成的Traversable可能是沒有問題的List。
我有內容的文件是這樣的:如何分割一個文件源轉換爲字符串或單詞
"Some","Words","separated","by","comma","and","quoted","with","double","quotes"
文件是大讀取到只是字符串。
什麼是最簡單的方法分裂成一個Traversable的字符串,每個元素是一個單詞?
如果很重要:雖然文件的內容不適合單個字符串,但生成的Traversable可能是沒有問題的List。
這是你自己的解決方案的適應性,使用JavaConversions
操縱的Java迭代器作爲一個斯卡拉。
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
。
我做了它使用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
}
下面是使用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
}
}
我認爲它會留下第一個和最後一個報價,對不對? –
我不關心性能。更讓我困擾的是,它比較羅嗦。 –
@JensSchauder'stringLit'解析正確地處理引號。 – Philippe