Scala中的矩阵到CSV

Posted

技术标签:

【中文标题】Scala中的矩阵到CSV【英文标题】:Matrix to CSV in Scala 【发布时间】:2011-12-24 14:59:48 【问题描述】:

将 MxN 矩阵(M 行,N 列)写入 CSV 文件:

我的第一次尝试是使用 map,但是创建了 N 个对字符串缓冲区的引用。它还在每一行的末尾写了一个不必要的逗号。

def matrix2csv(matrix:List[List[Double]], filename: String ) = 
  val pw = new PrintWriter( filename )
  val COMMA = ","

  matrix.map( row => 
    val sbuf = new StringBuffer  
    row.map( elt => sbuf.append( elt ).append( COMMA ))
    pw.println(sbuf)
  )
  pw.flush
  pw.close

我的第二次尝试,使用 reduce,也有效,但看起来很笨重:

def matrix2csv(matrix:List[List[Double]], filename: String ) = 
  val pw = new PrintWriter( filename )
  val COMMA = ","

  matrix.map( row => 
    val sbuf = new StringBuffer  
    val last = row.reduce( (a,b)=> 
      sbuf.append(a).append(COMMA)
      b
    )
    sbuf.append(last)
    pw.println(sbuf)
  )
  pw.flush
  pw.close

对更简洁和惯用的方法有什么建议吗?谢谢。

【问题讨论】:

如何获得第二次编译尝试?在sbuf.append(b) 中,范围内没有b 【参考方案1】:

您可以轻松获得字符串表示:

val csvString = matrix.map _.mkString(", ") .mkString("\n")

然后你只需要将它转储到一个文件中。

注意结束行(这里是 "\n" ),它们因平台而异。

【讨论】:

谢谢,这非常简洁和惯用。【参考方案2】:

习惯上,您通过使用 map 执行副作用操作来滥用它。你应该使用foreach 来代替。

如果您使用 foreach 并将您的 StringBuffer 样板替换为对 mkString 方法的调用,这就是它的样子:

def matrix2csv(matrix:List[List[Double]], filename: String) 
  val pw = new PrintWriter(filename)
  val COMMA = ","
  matrix.foreach  row => pw.println(row mkString COMMA) 
  pw.flush
  pw.close

请注意,mkString 使用 StringBuilder(非线程安全的 StringBuffer,这在这里很好)。

【讨论】:

以上是关于Scala中的矩阵到CSV的主要内容,如果未能解决你的问题,请参考以下文章

Scala Breeze的*和*:*在矩阵和向量中的用法

如何从 Scala 中的 DataFrame 在 Spark 中创建分布式稀疏矩阵

spark实现ALS矩阵分解-附scala代码

spark实现ALS矩阵分解-附scala代码

Python读取csv到矩阵中

3 列 CSV,到邻接矩阵,到网络图,到 Arcplot