Scala中如何将键值对CSV文件转换为Map[String,String]集合
Scala读取CSV映射文件生成Map的实现方法
现有存储缩写与完整值映射关系的CSV文件内容如下:
original,mappedValue bbc,britishBroadcastingCorporation ch4,channel4
需要转换得到的目标Map结构:
val x:Map[String,String] = Map("bbc"->"britishBroadcastingCorporation", "ch4"->"channel4")
当前使用Source.fromFile("pathToFile.csv").getLines().drop(1).map(_.split(","))得到的是Iterator[Array[String]]类型,无法直接生成Map,可按如下方式修改代码:
基础实现
在原有拆分逻辑的基础上,将拆分得到的数组转为键值对二元组,最后调用toMap即可:
import scala.io.Source val x: Map[String, String] = Source .fromFile("pathToFile.csv") .getLines() .drop(1) // 跳过第一行表头 .map(line => { val Array(key, value) = line.split(",", 2) key -> value }) .toMap
关键点说明
split(",", 2)传入第二个参数限制最大拆分长度为2,避免后续映射值本身包含逗号时,拆分出数组长度不符合预期触发报错- 拆分后通过
key -> value生成Scala二元组,Iterator中存储二元组时可直接调用toMap方法收集为键值对集合,完全匹配目标结构
资源安全写法
直接使用Source会占用文件句柄,推荐使用Using自动管理资源,避免资源泄漏:
import scala.io.Source import scala.util.Using val mapResult: Either[Throwable, Map[String, String]] = Using(Source.fromFile("pathToFile.csv")) { source => source .getLines() .drop(1) .map { line => val Array(k, v) = line.split(",", 2) k -> v } .toMap }
执行后从mapResult中即可取到生成的Map对象,文件资源会在逻辑执行完成后自动关闭。
内容的提问来源于stack exchange,提问作者Scala_beginner
相关产品推荐
相关产品推荐

