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的主要内容,如果未能解决你的问题,请参考以下文章