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言語の全貌を一発で理解できる解説スライドを公開しました!

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ