2016-03-19 10 views
1

GOでテーブルを印刷する簡単で効率的な方法を知りたいと思います。私が見つけた解決策は動作しますが、実際には醜いです。GOでテーブルを印刷する効率的な方法

多くのタンク!例えば

outfile := "file.tsv" 
f, err := os.Create(outfile)var buffer bytes.Buffer 

      buffer.WriteString(a[i]) 
      buffer.WriteString("\t") 
      buffer.WriteString(a[j]) 
      buffer.WriteString("\t") 
      buffer.WriteString(strconv.FormatFloat(x, 'f', 4, 64)) 
      buffer.WriteString("\n") 
      // // write results to outfile 
      f.WriteString(buffer.String()) 
+0

['tabwriter'](https://golang.org/pkg/text/tabwriter/)パッケージを調べてください。 –

答えて

2

package main 

import (
    "encoding/csv" 
    "fmt" 
    "os" 
    "strconv" 
) 

func main() { 
    outfile := "file.tsv" 
    f, err := os.Create(outfile) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    defer f.Close() 
    w := csv.NewWriter(f) 
    defer w.Flush() 
    w.Comma = '\t' 

    a := []string{"a", "b"} 
    i, j := 0, 1 
    x := float64(2.7) 

    // Write row. 
    err = w.Write(
     []string{ 
      a[i], a[j], 
      strconv.FormatFloat(x, 'f', 4, 64), 
     }, 
    ) 
    if err != nil { 
     fmt.Println(err) 
    } 
} 

出力:

$ cat file.tsv 
a b 2.7000 
$ 

あなたはゴルーチンを使用している場合は、ここでcsv.Writerを保護するために、ミューテックスを使用したバージョンです。

package main 

import (
    "encoding/csv" 
    "fmt" 
    "os" 
    "strconv" 
    "sync" 
) 

type csvWriter struct { 
    w *csv.Writer 
    m sync.Mutex 
} 

func (c *csvWriter) write(rec []string) error { 
    c.m.Lock() 
    defer c.m.Unlock() 
    return c.w.Write(rec) 
} 

func (c *csvWriter) flush() { 
    c.m.Lock() 
    defer c.m.Unlock() 
    c.w.Flush() 
} 

func main() { 
    outfile := "file.tsv" 
    f, err := os.Create(outfile) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    defer f.Close() 
    w := csvWriter{w: csv.NewWriter(f)} 
    defer w.flush() 
    w.w.Comma = '\t' 

    a := []string{"a", "b"} 
    i, j := 0, 1 
    x := float64(2.7) 

    // Write row. 
    err = w.write(
     []string{ 
      a[i], a[j], 
      strconv.FormatFloat(x, 'f', 4, 64), 
     }, 
    ) 
    if err != nil { 
     fmt.Println(err) 
    } 
} 
+0

うわー!私の解決策よりはるかに良い! ;)が! – Fred

+0

GO並列ルーチンでw.Writeを使用することはできますか?私は同じコードを試したのでいくつかの行が一緒にマージされています:) – Fred

+0

@Fred:いいえあなたはcsv.Writer上で競合状態になります:[Going Race Detectorの紹介](http://blog.golang.org/レースディテクタ)。ミューテックスを使ってcsv.Writerを保護する例については、私の改訂版の回答を参照してください。 – peterSO

関連する問題