在Go语言中打印表格的高效方法是什么?

huangapple go评论132阅读模式
英文:

The efficient way to print a table in GO

问题

我想知道在Go语言中打印表格的简单高效的方法。我找到的解决方案虽然可行,但非常丑陋。

非常感谢!

  1. outfile := "file.tsv"
  2. f, err := os.Create(outfile)
  3. var buffer bytes.Buffer
  4. buffer.WriteString(a[i])
  5. buffer.WriteString("\t")
  6. buffer.WriteString(a[j])
  7. buffer.WriteString("\t")
  8. buffer.WriteString(strconv.FormatFloat(x, 'f', 4, 64))
  9. buffer.WriteString("\n")
  10. // 将结果写入文件
  11. f.WriteString(buffer.String())
英文:

I would like to know a simple and efficient way to print a table in Go. The solution I found works but it is really ugly.

many Thanks !

  1. outfile := "file.tsv"
  2. f, err := os.Create(outfile)
  3. var buffer bytes.Buffer
  4. buffer.WriteString(a[i])
  5. buffer.WriteString("\t")
  6. buffer.WriteString(a[j])
  7. buffer.WriteString("\t")
  8. buffer.WriteString(strconv.FormatFloat(x, 'f', 4, 64))
  9. buffer.WriteString("\n")
  10. // // write results to outfile
  11. f.WriteString(buffer.String())

答案1

得分: 43

tabwriter 包是标准库中用于这种情况的简单易用的工具:

  1. w := tabwriter.NewWriter(os.Stdout, 1, 1, 1, ' ', 0)
  2. fmt.Fprintln(w, "a\tb\tc\td\t")
  3. fmt.Fprintln(w, "aa\tbb\tcc\t")
  4. fmt.Fprintln(w, "aaa\tbbb\tccc\t")
  5. fmt.Fprintln(w, "aaaa\tbbbb\tcccc\tdddd\t")
  6. w.Flush()
  7. // 输出结果:
  8. // a b c d
  9. // aa bb cc
  10. // aaa bbb ccc
  11. // aaaa bbbb cccc dddd

你可以将 os.Stdout 替换为任何 io.Writer

英文:

The tabwriter package in the standard library is simple and easy for this kind of thing:

  1. w := tabwriter.NewWriter(os.Stdout, 1, 1, 1, ' ', 0)
  2. fmt.Fprintln(w, "a\tb\tc\td\t")
  3. fmt.Fprintln(w, "aa\tbb\tcc\t")
  4. fmt.Fprintln(w, "aaa\tbbb\tccc\t")
  5. fmt.Fprintln(w, "aaaa\tbbbb\tcccc\tdddd\t")
  6. w.Flush()
  7. // Prints out:
  8. // a b c d
  9. // aa bb cc
  10. // aaa bbb ccc
  11. // aaaa bbbb cccc dddd

You can replace the os.Stdout with any io.Writer.

答案2

得分: 4

例如,

  1. package main
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. )
  8. func main() {
  9. outfile := "file.tsv"
  10. f, err := os.Create(outfile)
  11. if err != nil {
  12. fmt.Println(err)
  13. os.Exit(1)
  14. }
  15. defer f.Close()
  16. w := csv.NewWriter(f)
  17. defer w.Flush()
  18. w.Comma = '\t'
  19. a := []string{"a", "b"}
  20. i, j := 0, 1
  21. x := float64(2.7)
  22. // 写入行
  23. err = w.Write(
  24. []string{
  25. a[i], a[j],
  26. strconv.FormatFloat(x, 'f', 4, 64),
  27. },
  28. )
  29. if err != nil {
  30. fmt.Println(err)
  31. }
  32. }

输出:

  1. $ cat file.tsv
  2. a b 2.7000
  3. $

如果你使用goroutines,这是一个使用互斥锁保护csv.Writer的版本。

  1. package main
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. "sync"
  8. )
  9. type csvWriter struct {
  10. w *csv.Writer
  11. m sync.Mutex
  12. }
  13. func (c *csvWriter) write(rec []string) error {
  14. c.m.Lock()
  15. defer c.m.Unlock()
  16. return c.w.Write(rec)
  17. }
  18. func (c *csvWriter) flush() {
  19. c.m.Lock()
  20. defer c.m.Unlock()
  21. c.w.Flush()
  22. }
  23. func main() {
  24. outfile := "file.tsv"
  25. f, err := os.Create(outfile)
  26. if err != nil {
  27. fmt.Println(err)
  28. os.Exit(1)
  29. }
  30. defer f.Close()
  31. w := csvWriter{w: csv.NewWriter(f)}
  32. defer w.flush()
  33. w.w.Comma = '\t'
  34. a := []string{"a", "b"}
  35. i, j := 0, 1
  36. x := float64(2.7)
  37. // 写入行
  38. err = w.write(
  39. []string{
  40. a[i], a[j],
  41. strconv.FormatFloat(x, 'f', 4, 64),
  42. },
  43. )
  44. if err != nil {
  45. fmt.Println(err)
  46. }
  47. }
英文:

For example,

  1. package main
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. )
  8. func main() {
  9. outfile := "file.tsv"
  10. f, err := os.Create(outfile)
  11. if err != nil {
  12. fmt.Println(err)
  13. os.Exit(1)
  14. }
  15. defer f.Close()
  16. w := csv.NewWriter(f)
  17. defer w.Flush()
  18. w.Comma = '\t'
  19. a := []string{"a", "b"}
  20. i, j := 0, 1
  21. x := float64(2.7)
  22. // Write row.
  23. err = w.Write(
  24. []string{
  25. a[i], a[j],
  26. strconv.FormatFloat(x, 'f', 4, 64),
  27. },
  28. )
  29. if err != nil {
  30. fmt.Println(err)
  31. }
  32. }

Output:

  1. $ cat file.tsv
  2. a b 2.7000
  3. $

If you use goroutines, here's a version that uses a mutex to protect the csv.Writer.

  1. package main
  2. import (
  3. "encoding/csv"
  4. "fmt"
  5. "os"
  6. "strconv"
  7. "sync"
  8. )
  9. type csvWriter struct {
  10. w *csv.Writer
  11. m sync.Mutex
  12. }
  13. func (c *csvWriter) write(rec []string) error {
  14. c.m.Lock()
  15. defer c.m.Unlock()
  16. return c.w.Write(rec)
  17. }
  18. func (c *csvWriter) flush() {
  19. c.m.Lock()
  20. defer c.m.Unlock()
  21. c.w.Flush()
  22. }
  23. func main() {
  24. outfile := "file.tsv"
  25. f, err := os.Create(outfile)
  26. if err != nil {
  27. fmt.Println(err)
  28. os.Exit(1)
  29. }
  30. defer f.Close()
  31. w := csvWriter{w: csv.NewWriter(f)}
  32. defer w.flush()
  33. w.w.Comma = '\t'
  34. a := []string{"a", "b"}
  35. i, j := 0, 1
  36. x := float64(2.7)
  37. // Write row.
  38. err = w.write(
  39. []string{
  40. a[i], a[j],
  41. strconv.FormatFloat(x, 'f', 4, 64),
  42. },
  43. )
  44. if err != nil {
  45. fmt.Println(err)
  46. }
  47. }

答案3

得分: 2

选择一个现有的包可以简化你的代码,同时增加代码的可维护性。尝试使用go-pretty包。

  1. +---------------------------------------------------------------------+
  2. | Game of Thrones +
  3. +-----+------------+-----------+--------+-----------------------------+
  4. | # | FIRST NAME | LAST NAME | SALARY | |
  5. +-----+------------+-----------+--------+-----------------------------+
  6. | 1 | Arya | Stark | 3000 | |
  7. | 20 | Jon | Snow | 2000 | You know nothing, Jon Snow! |
  8. | 300 | Tyrion | Lannister | 5000 | |
  9. +-----+------------+-----------+--------+-----------------------------+
  10. | | | TOTAL | 10000 | |
  11. +-----+------------+-----------+--------+-----------------------------+
英文:

choose a exist package can simple your code and also increase code maintainability。try go-pretty

  1. +---------------------------------------------------------------------+
  2. | Game of Thrones +
  3. +-----+------------+-----------+--------+-----------------------------+
  4. | # | FIRST NAME | LAST NAME | SALARY | |
  5. +-----+------------+-----------+--------+-----------------------------+
  6. | 1 | Arya | Stark | 3000 | |
  7. | 20 | Jon | Snow | 2000 | You know nothing, Jon Snow! |
  8. | 300 | Tyrion | Lannister | 5000 | |
  9. +-----+------------+-----------+--------+-----------------------------+
  10. | | | TOTAL | 10000 | |
  11. +-----+------------+-----------+--------+-----------------------------+

huangapple
  • 本文由 发表于 2016年3月19日 20:09:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/36101534.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定