Scala如何读取CSV文件至不定大小的二维数组/矩阵
解决你的Scala CSV处理代码错误
首先来看你标记行的问题:在Scala里,Array是泛型类型,你不能直接声明val seriesArray : Array,必须指定数组里元素的类型——这里你把分割后的字符串转成了Int,所以应该写成Array[Int]。
另外,你的需求是要得到存储所有行数据的数组的数组,但当前代码只是循环处理每行,没有把每行生成的数组收集起来,这也需要调整。
修正后的完整代码
import scala.io.Source object CsvProcessor { def main(args: Array[String]): Unit = { val file = "/home/tolga/Desktop/mics18-2/big-data/homework2/covtype.csv/data-10.csv" // 收集所有行的数组,最终得到Array[Array[Int]] val allRows: Array[Array[Int]] = Source.fromFile(file) .getLines() .map(line => line.split(",").map(_.toInt).distinct) // 每行转成Int数组并去重 .toArray // 把迭代器转换为数组的数组 // 可打印验证结果 allRows.foreach(row => println(row.mkString(", "))) } }
关键修正点
- 类型声明修正:把
Array改为Array[Int],明确数组元素类型,符合Scala的强类型语法要求。 - 收集所有行数据:使用
toArray将getLines()返回的迭代器转换为数组的数组,这样就能把所有行处理后的结果统一存储起来,满足你的核心需求。 - 函数式风格优化:把原有的for循环改成链式调用,更贴合Scala的函数式编程习惯,代码也更简洁。
额外小提示:如果你的CSV里可能存在非数字内容,建议加上异常处理避免toInt抛出错误,比如:
.map(line => line.split(",").flatMap(str => scala.util.Try(str.toInt).toOption).distinct)
这样会自动跳过无法转换为Int的字符串,防止程序意外崩溃。
内容的提问来源于stack exchange,提问作者Tolga
相关产品推荐
相关产品推荐

