试图从一个文本文件中的行创建一个地图[字符串,字符串],不断收到错误[复制]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了试图从一个文本文件中的行创建一个地图[字符串,字符串],不断收到错误[复制]相关的知识,希望对你有一定的参考价值。
这个问题已经在这里有一个答案:
嗨所以我试图创建一个基于文本文件中的地图[字符串,字符串],在文本文件有打头的arbritrary线“;;;”我忽略与功能和我不忽略线是键 - >值。它们由2个空格分隔。
每当我跑我的代码我得到一个错误说预期的类型地图[字符串,字符串]是不是需要的类型,即使我的转换似乎是正确的。
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
我希望它返回一个(字符串 - >字符串)地图,而是我得到一堆错误。将如何解决这一问题?
答案
由于您的if语句是不是在for循环的表达式。产生的结果时,你应该使用,如果作为一个过滤器。要返回一个结果,你必须让一个换理解。后换的理解对结果进行过滤。您可以将这个结构映射到地图。
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
好了,所以我把第二次看。它看起来像文件中有一些腐败编码。你可以试试这个作为一种解决方案。它的工作在我的斯卡拉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
以上是关于试图从一个文本文件中的行创建一个地图[字符串,字符串],不断收到错误[复制]的主要内容,如果未能解决你的问题,请参考以下文章