尝试从文本文件中的行创建Map [String,String],不断出现错误

时间:2019-02-12 02:14:49

标签: string scala dictionary

嗨,所以我试图基于文本文件创建Map [String,String],在文本文件中有以“ ;;;”开头的任意行。我忽略的功能,我不忽略的行是key->值。它们用2个空格隔开。

每当我运行代码时,我都会收到一条错误消息,说明期望的类型Map [String,String]不是必需的类型,即使我的转换似乎正确。

def createMap(filename: String): Map[String,String] = {
    for (line <- Source.fromFile(filename).getLines) {
      if (line.nonEmpty && !line.startsWith(";;;")) {
        val string: String = line.toString
        val splits: Array[String] = string.split("  ")
        splits.map(arr => arr(0) -> arr(1)).toMap
      }
    }
  }

我希望它返回一个(String-> String)映射,但是相反,我遇到了一堆错误。我该如何解决?

1 个答案:

答案 0 :(得分:1)

由于您的if语句不是for循环中的表达式。产生结果时,应将if用作过滤器。要返回结果,您必须使其具有理解力。理解后过滤结果。您可以将此结构映射到Map。

import scala.io.Source
def createMap(filename: String): Map[String,String] = {
  val keyValuePairs = for (line <- Source.fromFile(filename).getLines; if line.nonEmpty && !line.startsWith(";;;")) yield {
      val string = line.toString
      val splits: Array[String] = string.split("  ")
      splits(0) -> splits(1)
  }
  keyValuePairs.toMap
}

好的,所以我再看了一下。该文件似乎具有一些损坏的编码。您可以尝试此作为解决方案。它在我的Scala REPL中有效:

import java.nio.charset.CodingErrorAction
import scala.io.{Codec, Source}

def createMap(filename: String): Map[String,String] = {
  val decoder = Codec.UTF8.decoder.onMalformedInput(CodingErrorAction.IGNORE)
  Source.fromFile(filename)(decoder).getLines()
    .filter(line => line.nonEmpty && !line.startsWith(";;;"))
    .flatMap(line => {
      val arr = line.split("\\s+")
      arr match {
        case Array(key, value) => Some(key -> value)
        case Array(key, values@_*) => Some(key -> values.mkString(" "))
        case _ => None
      }
    }).toMap
}