如何在Scala中将CSV列读入向量
我有一个CSV文件: 我想创建这样的地图:如何在Scala中将CSV列读入向量,scala,Scala,我有一个CSV文件: 我想创建这样的地图: ((A -> Vector(10.75,10.75,10.47,...,..), B-> Vector(164.56,164.99,160.98,...), C -> Vector(7.1,7.4,9.4,...,), D - > Vector(14.2,14.8,18.8,...,..)) 这就是我目前所拥有的(不多): 此代码打印以下内容: 我的向量包含行,我需要我的向量包含列,而不是CSV中的行。一旦您阅读了行,并有
((A -> Vector(10.75,10.75,10.47,...,..), B-> Vector(164.56,164.99,160.98,...), C -> Vector(7.1,7.4,9.4,...,), D - > Vector(14.2,14.8,18.8,...,..))
这就是我目前所拥有的(不多):
此代码打印以下内容:
我的向量包含行,我需要我的向量包含列,而不是CSV中的行。一旦您阅读了行,并有类似的内容
val行:Seq[Seq[String]=???
,只需执行
val columns = "ABC..."
lines
.iterator
.map { row => columns.zip(row) }
.groupBy { _._1 }
.mapValues { _._2 }
.toMap
如果出于某种奇怪的原因,您希望它特别是
向量
,那么只需将添加到之后的[Vector]
。\u 2
首先,请不要将重要的文本信息作为图像发布。我们无法从图像复制粘贴
我创建了一个较小的测试文件,如下所示:
A,B,C
10.75,10.75,10.47
164.56,164.99,160.98
7.1,7.4,9.4
14.2,14.8,18.8
有了它,我运行了这段代码
util.Using(io.Source.fromFile("train3.csv")){
_.getLines()
.map(_.split(","))
.toVector
.transpose
.groupMapReduce(_.head)(_.tail.map(_.toFloat))(_++_)
} //file is auto-closed
//res0: Try[Map[String,Vector[Float]]] =
// Success(Map(A -> Vector(10.75, 164.56, 7.1, 14.2)
// , B -> Vector(10.75, 164.99, 7.4, 14.8)
// , C -> Vector(10.47, 160.98, 9.4, 18.8)))
如果无法打开文件,或者行长度不一致,或者无法转换数字字符串,这将返回
Failure()
。(这可能不是必需的。我只是认为这是可取的。)嗨!非常感谢你的回答。我要查找的结果包含向量中的列,例如:A->Vector(10.75,10.75,10.47,…)、B->Vector(164.56164.99160.98,…)、C->Vector(7.1,7.4,9.4,…)、D->Vector(14.2,14.8,18.8,…)您的结果显示了向量中的每一行,这是我设法做到的。我将确保下次不会将代码作为照片发布。请再次查看@babilon1210。由于我无法从您的图像复制粘贴,因此我从您发布的Map
中进行了复制粘贴,并将其向下编辑为数据。因此,我发布的原始输入文件不是您所拥有的输入文件,但它表明代码完全符合您的要求。非常感谢!效果很好!
util.Using(io.Source.fromFile("train3.csv")){
_.getLines()
.map(_.split(","))
.toVector
.transpose
.groupMapReduce(_.head)(_.tail.map(_.toFloat))(_++_)
} //file is auto-closed
//res0: Try[Map[String,Vector[Float]]] =
// Success(Map(A -> Vector(10.75, 164.56, 7.1, 14.2)
// , B -> Vector(10.75, 164.99, 7.4, 14.8)
// , C -> Vector(10.47, 160.98, 9.4, 18.8)))