2011-11-08 35 views
5

Viết ma trận MxN (M hàng, N cột) vào tệp CSV:Ma trận sang CSV ở Scala

Lần đầu tiên, sử dụng bản đồ, công trình, nhưng tạo N tham chiếu đến bộ xâu chuỗi. Nó cũng viết một dấu phẩy không cần thiết ở cuối mỗi hàng.

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 
} 

nỗ lực thứ hai của tôi, sử dụng giảm, cũng làm việc nhưng trông vụng về:

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 
} 

Bất kỳ đề xuất về một cách tiếp cận ngắn gọn hơn và thành ngữ? Cảm ơn.

+0

Làm cách nào để bạn có được nỗ lực biên dịch thứ 2? Trong 'sbuf.append (b)', không có 'b' trong phạm vi. –

+0

Cảm ơn Ben. Sửa lỗi đó. –

Trả lời

8

Bạn có thể lấy các chuỗi đại diện một cách dễ dàng:

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

Sau đó, bạn chỉ cần đổ nó trong một tập tin.

Chú ý đến dòng cuối (ở đây "\ n"), chúng thay đổi tùy theo nền tảng.

+0

Cảm ơn, đó là rất ngắn gọn và thành ngữ. –

5

Về mặt tự nhiên, bạn đang lạm dụng map bằng cách sử dụng nó để thực hiện các tác vụ phụ. Thay vào đó, bạn nên sử dụng foreach.

Đây là những gì nó có thể trông như thế nào nếu bạn sử dụng một foreach và thay thế StringBuffer soạn sẵn của bạn với một cuộc gọi đến mkString phương pháp:

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 
} 

Lưu ý rằng mkString sử dụng một StringBuilder (một tổ chức phi-thread-safe StringBuffer ở đây).