Scala文件行映射

时间:2019-02-15 03:06:46

标签: scala scala-collections

我目前正在打开我的文件,并使用.getLines从文件中检索每个单词,每个单词带有一个单词,其语音发音用两个空格隔开,我对如何映射单词及其含义感到困惑在Scala中读发音,因为我是该语言的新手。 我以前虽然曾利用将单词和它们的声音拆分和分离成不同的行,但是我迷路了

目前我是从

开始的

  def words(filename: String, word: String): Unit = {
    val file = Source.fromFile(filename).getLines().drop(56)
    for(x <- file){
      
    }

 }

EX:

ARTI  AA1 R T IY2
AASE  AA1 S
ABAIR  AH0 B EH1 R
AB  AE1 B

结果:

Map("AARTI -> "AA1 R T IY2","AASE" -> "AA1 S", "ABAIR" -> " AH0 B EH1 R")

2 个答案:

答案 0 :(得分:2)

  • 重复每一行
  • 由2个空白" "
  • 分隔
  • 创建(a-> b)的元组
  • 转换Array[Tuple[A, B]] => Map[A, B]

示例

    val data =
      """
ARTI  AA1 R T IY2
AASE  AA1 S
ABAIR  AH0 B EH1 R
AB  AE1 B
      """.stripMargin

    val lines: Array[String] = data.split("\n").filter(_.trim.nonEmpty)
    // if you are reading from file
    // val lines = Source.fromFile("src/test/resources/my_filename.txt").getLines()

    val res: Array[Tuple2[String, String]] = lines.map { line =>
      line.split("  ") match { case Array(a, b) => a -> b }
    }

    println(res.toMap)

输出:

Map(ARTI -> AA1 R T IY2, AASE -> AA1 S, ABAIR -> AH0 B EH1 R, AB -> AE1 B)

运行示例-https://scastie.scala-lang.org/prayagupd/jBCnEhUPQJCMPKP9TXlgWA

How to read entire file in Scala?

答案 1 :(得分:1)

如果您的行位于file中,则将从第一个单词到字符串的其余部分创建一个Map

val res: Map[String, String] = file.map(_.span(_.isLetter))(collection.breakOut)

Map中的值将包含前导空格字符,因此您可能需要在使用它们之前调用trim

  1. map调用依次处理每一行。

  2. span方法将行拆分为元组,其中第一个值是您的单词,第二个值是行的其余部分。

  3. 使用collection.breakOut告诉map将结果直接放入Map中,而不是通过中间数组或列表。