解析CSV时如何将Scala Map的键转换为Int类型?
解决Scala CSV解析生成[Int, String] Map的问题
你的问题出在两个核心点:一是CSV每行结尾的逗号会导致分割后产生空字符串,二是直接用toInt转换未处理异常场景(比如空行、键含空白、非数字键),最终触发NumberFormatException。
以下是可靠的解决代码:
import scala.io.Source val source = Source.fromFile("src/main/Mapping.csv") val intStringMap: Map[Int, String] = source.getLines() // 清理每行前后的空白字符(包括换行、空格) .map(_.trim) // 过滤掉空行 .filter(_.nonEmpty) .map { line => // 分割后清理每个元素,过滤掉空字符串(解决结尾逗号的问题) val parts = line.split(",").map(_.trim).filter(_.nonEmpty) // 确保至少有两个有效元素,否则返回空键值对后续过滤 if (parts.length >= 2) (parts(0), parts(1)) else ("", "") } // 过滤掉无效的键值对 .filter { case (k, v) => k.nonEmpty && v.nonEmpty } // 安全转换字符串到Int,失败的条目直接忽略 .flatMap { case (k, v) => k.toIntOption.map(intKey => (intKey, v)) } .toMap // 必须关闭文件资源,避免泄漏 source.close()
关键处理细节:
- 清理空白:用
trim处理每行和每个分割元素,避免类似" 1 "这样带空格的字符串转Int失败 - 过滤无效数据:跳过空行和分割后元素不足的行,避免无效数据进入转换流程
- 安全类型转换:用
toIntOption替代toInt,转换失败时返回None,通过flatMap自动过滤这些无效条目,不会抛出异常 - 资源关闭:读取文件后必须调用
source.close(),防止文件资源泄漏
针对你给出的CSV示例,这段代码会生成Map(1 -> "2", 3 -> "4"),完全符合需求。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

