You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:03:26