我有一个 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 映射到 IndexedSeq 以Tupel[String,Array[String]]
将标签值与其余值分开,然后从中创建 Map。
val result: Map[String, Array(String) = data.filter(e => !e.isEmpty).map(e => (e.head,e.tail)).toMap
这适用于小示例,但是当我使用它来读取 CSV 文件的内容时,它会引发 java.lang.RuntimeException。我还尝试使用 groupBy 创建地图或创建多个地图(每行一个),然后将它们减少为一个大地图,但没有成功。我还阅读了关于 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 文件中的数据创建地图的另一种方法吗?