2011-11-08 57 views
5

寫一個m×n矩陣(M行,N列)爲CSV文件:矩陣以CSV斯卡拉

我第一次嘗試,利用地圖,工作,但創造的StringBuffer的ñ引用。它還在每行的末尾寫入不必要的逗號。

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 
} 

我的第二次嘗試,使用減少,也有效,但看起來笨重:

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 
} 

任何建議上更加簡潔,地道的做法?謝謝。

+0

你如何獲得第二次編譯的嘗試?在'sbuf.append(b)'中,範圍中沒有'b'。 –

+0

謝謝本。修正了。 –

回答

8

您可以輕鬆地獲得字符串表示:

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

然後你只需要傾倒在一個文件中。

注意結束行(這裏是「\ n」),它們因平臺而異。

+0

謝謝,這是非常簡潔和習慣。 –

5

通過使用它來執行副作用操作,您在使用中會錯誤地使用map。相反,您應該使用foreach

這是它可能是什麼樣子,如果你使用了foreach,享有與mkString方法的調用替換您的StringBuffer樣板:

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 ,這裏很好)。