试图从一个文本文件中的行创建一个地图[字符串,字符串],不断收到错误[复制]

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

以上是关于试图从一个文本文件中的行创建一个地图[字符串,字符串],不断收到错误[复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python:从文本文件中逐字符创建一个字符串数组[关闭]

制作其他列表中包含字符串的行列表

如何从具有由“|”分隔的字段的行中提取数据C++中的字符?

sed:查找并替换以特定字符串开头的行中的第 n 个字符

如何在C++中 统计多行文本中的行数、单词数及字符数

Perl - 如何从文本文件中省略行?