gpt4 book ai didi

scala - 如何读取 CSV 文件并将其内容放入 Scala 的 Map 中?

转载 作者:行者123 更新时间:2023-12-01 08:32:20 28 4
gpt4 key购买 nike

我有一个 CSV 文件,其中包含一个数据矩阵。该矩阵的第一列包含一个标签,其他列包含与标签(即第一列)相关联的值。现在我想读取这个 CSV 文件并将数据放入 Scala 中的 Map[String,Array[String]] 中。 Map 的键应该是标签(这在第一列中),而 Map 值应该是其他值(这些在其余列中)。要读取 CSV 文件,我使用 opencsv。

val isr: InputStreamReader = new InputStreamReader(getClass.getResourceAsStream("test.csv"))`  
val data: IndexedSeq[Array[String]] = new CSVReader(isr).readAll.asScala.toIndexedSeq`

现在我拥有 IndexedSeq[Array[String]] 中的所有数据.我可以在这里使用这种功能方式还是我应该更好地选择一种迭代方式,因为一次读取所有数据会变得很复杂?好吧,现在我需要从这个 IndexedSeq 创建 Map。因此,我将 IndexedSeq 映射到 Tupel[String,Array[String]] 的 IndexedSeq。将标签值与其余值分开,然后我从中创建 map 。
val result: Map[String, Array(String) = data.filter(e => !e.isEmpty).map(e => (e.head,e.tail)).toMap

这适用于小例子,但是当我用它来读取我的 CSV 文件的内容时,它会抛出一个 java.lang.RuntimeException。我还尝试使用 groupBy 创建 map 或创建多个 map (每行一个),然后将它们缩小为一张大 map ,但没有成功。我还阅读了关于 stackoverflow 的另一篇文章,有人认为 toMap 的复杂度为 O(n²)。我在 StackTrace 结束时得到了这个(整个 Stacktrace 很长)。
Exception in thread "main" java.lang.reflect.InvocationTargetException      
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.jetbrains.plugins.scala.testingSupport.specs2.JavaSpecs2Runner.runSingleTest(JavaSpecs2Runner.java:130)
at org.jetbrains.plugins.scala.testingSupport.specs2.JavaSpecs2Runner.main(JavaSpecs2Runner.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.RuntimeException: can not create specification: com.test.MyClassSpec
at scala.sys.package$.error(package.scala:27)
at org.specs2.specification.SpecificationStructure$.createSpecification(BaseSpecification.scala:96)
at org.specs2.runner.ClassRunner.createSpecification(ClassRunner.scala:64)
at org.specs2.runner.ClassRunner.start(ClassRunner.scala:35)
at org.specs2.runner.ClassRunner.main(ClassRunner.scala:28)
at org.specs2.runner.NotifierRunner.main(NotifierRunner.scala:24)
... 11 more
Process finished with exit code 1

有人知道从 CSV 文件中的数据创建 map 的另一种方法吗?

最佳答案

这对我有用:

import scala.io.Source
Source.fromFile("some_very_big_file").getLines.map(_.split(";")).count(_ => true)
split 将 CSV 文件的每一行分解为简单的记录。 count 仅用于检查文件是否真的被读取。

所以现在我们可以用它来读入一个真正的 CSV 文件(虽然我只用一个小文件测试了它):
scala> val content=Source.fromFile("test.csv").getLines.map(_.split(";"))
content: Iterator[Array[java.lang.String]] = non-empty iterator

scala> val header=content.next
header: Array[java.lang.String] = Array(Elements, Duration)

scala> content.map(header.zip(_).toMap)
res40: Iterator[scala.collection.immutable.Map[java.lang.String,java.lang.String]] = non-empty iterator

这适用于简单的 CSV 文件。如果您有更复杂的(例如,条目溢出多行),您可能必须使用更复杂的 CSV 解析器(例如 Apache Commons CSV 。但通常此类 aperser 也会为您提供某种迭代器,您可以使用相同的 map(... zip ...) 函数它。

关于scala - 如何读取 CSV 文件并将其内容放入 Scala 的 Map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17238134/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com