Scala中的Matrix到CSV

k r*_*k r 5 csv reduce scala map matrix

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

我的第一次尝试,使用map,可以工作,但是创建了对stringbuffer的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
}
Run Code Online (Sandbox Code Playgroud)

我的第二次尝试,使用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
}
Run Code Online (Sandbox Code Playgroud)

有关更简洁和惯用方法的任何建议吗?谢谢.

par*_*tic 8

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

val csvString = matrix.map{ _.mkString(", ") }.mkString("\n")
Run Code Online (Sandbox Code Playgroud)

然后你只需要将其转储到一个文件中.

注意终点线(此处为"\n"),它们根据平台而有所不同.


Ben*_*mes 5

在惯用语中,您map通过使用它来执行副作用操作而误用.你应该用foreach它代替.

如果您使用a foreachStringBuffer通过调用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
}
Run Code Online (Sandbox Code Playgroud)

注意mkString使用a StringBuilder(非线程安全StringBuffer,这里没问题).