【问题标题】:Matrix to CSV in ScalaScala中的矩阵到CSV
【发布时间】: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

标签: scala csv map matrix reduce


【解决方案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,这在这里很好)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多