Scala中的CSV矩阵
将MxN矩阵(M行,N列)写入CSV文件: 我的第一次尝试是使用map,可以工作,但是创建了N个对stringbuffer的引用。它还会在每行末尾写入一个不必要的逗号Scala中的CSV矩阵,scala,csv,map,matrix,reduce,Scala,Csv,Map,Matrix,Reduce,将MxN矩阵(M行,N列)写入CSV文件: 我的第一次尝试是使用map,可以工作,但是创建了N个对stringbuffer的引用。它还会在每行末尾写入一个不必要的逗号 def matrix2csv(matrix:List[List[Double]], filename: String ) = { val pw = new PrintWriter( filename ) val COMMA = "," matrix.map( row => { val sbuf = ne
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
}
有没有关于更简洁、更惯用的方法的建议?谢谢。您可以轻松获得字符串表示:
val csvString = matrix.map{ _.mkString(", ") }.mkString("\n")
然后你只需要将它转储到一个文件中
请注意端点(此处为“\n”),它们根据平台的不同而不同。惯用的说法是,您误用了
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
,在这里很好)。如何进行第二次编译尝试?在sbuf.append(b)
中,范围中没有b
。谢谢,这非常简洁和惯用。