CSVを色分けするだけのコマンド作ってみたhttps://t.co/7CaNaZBrW3 #golang pic.twitter.com/MfeoKQYzyN
— OreKanegon (@hachi8833) December 26, 2018
csvu
コマンド
rainbow_csvというVim向けのプラグインを見かけて、これをCLIでパイプで使いたくなってきました。
ちゃんと探してませんが、ネットにはありそうでなかったっぽいので、帰りの電車が着くまでの間にGo言語でざざっと書いてしまいました。
- リポジトリ: hachi8833/csvu
何のひねりもない、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言語で書かれた同種のツールが既にあることに昨日やっと気づきました💦。しかも私のより短く端的なコードで、かつエンコードにも対応しています🤕。
- リポジトリ: nak1114/ccsv
おたより発掘
Go言語: CSVを色分け表示するフィルタ「csvu」を作った
これめっちゃいいなー😌 https://t.co/vGhiNctQEH
— fatal flaw (@yamukotonaku) March 22, 2019