Tech Racho エンジニアの「?」を「!」に。
  • 開発

Go言語: CSVを色分け表示するフィルタ「csvu」を作った

csvuコマンド

rainbow_csvというVim向けのプラグインを見かけて、これをCLIでパイプで使いたくなってきました。

ちゃんと探してませんが、ネットにはありそうでなかったっぽいので、帰りの電車が着くまでの間にGo言語でざざっと書いてしまいました。

何のひねりもない、Hello Worldに毛が生えたようなツールです。ネーミングも脊髄反射です。

package main

import (
  "encoding/csv"
  "fmt"
  "github.com/logrusorgru/aurora"
  "io"
  "os"
)

func main() {

  fp := readStdin()

  reader := csv.NewReader(fp)
  reader.Comma = ','
  reader.LazyQuotes = true

  for {
    record, err := reader.Read()
    if err == io.EOF {
      break
    } else if err != nil {
      panic(err)
    }
    for i, col := range record {
      rotateColor(i, col)
    }
    fmt.Println()
  }
}

func rotateColor(i int, col interface{}) {
  delim := " "
  switch i % 7 {
  case 0:
    fmt.Print(aurora.Magenta(col), delim)
  case 1:
    fmt.Print(aurora.Blue(col), delim)
  case 2:
    fmt.Print(aurora.Brown(col), delim)
  case 3:
    fmt.Print(aurora.Green(col), delim)
  case 4:
    fmt.Print(aurora.Gray(col), delim)
  case 5:
    fmt.Print(aurora.Cyan(col), delim)
  case 6:
    fmt.Print(aurora.Red(col), delim)
  }
  return
}

func readStdin() *os.File {
  var fp *os.File
  if len(os.Args) < 2 {
    fp = os.Stdin
  } else {
    var err error
    fp, err = os.Open(os.Args[1])
    if err != nil {
      panic(err)
    }
    defer fp.Close()
  }
  return fp
}

本当に単機能なので、CSVのエンコードはUTF-8固定で他のエンコードは面倒見ませんし、エラーはpanicで落とすだけ。
暖色系と寒色系が連続しないように注意したぐらいです。

使ってみたい方は、Go言語環境があればgo get github.com/hachi8833/csvuでインストールできます。

日本郵便のサイトにある郵便番号CSVを食わせた結果は以下です。このCSVはShift_JISなので、nkfなどでUTF-8に変換してから処理しました。

参考: 郵便番号データダウンロード - 日本郵便

その後

同じくGo言語で書かれた同種のツールが既にあることに昨日やっと気づきました💦。しかも私のより短く端的なコードで、かつエンコードにも対応しています🤕。

おたより発掘

関連記事

Goby: Rubyライクな言語(2)Goby言語の全貌を一発で理解できる解説スライドを公開しました!


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。