golangでファイルを読んだり書いたりするコード書いてみた

golangでファイルを読んだり書いたりするコード書いてみた

February 15, 2015,
tags: golang markdown


このエントリーをはてなブックマークに追加

最近Hugoを使い始めてから、改めてgolangって早いなーと思う今日この頃です。 ちょっとしたテキストファイルを加工したいなーって事案が発生したので、せっかくだからgolangで実装してみました。

ちなみに五反田.goやったりとか、静岡go参加したりとかしてますが、僕はほとんどgolang触ったことありません。。。。

この様なツイートを見つけてしまって、とりあえずgolangの良い練習にもなるかなぁーって感じでスクリプト書いてみましたw
markdownファイルの1行目をタイトルとして、jekyllのFrontMatter追加するだけの簡単なスクリプトですが、こんな感じになりました。

package main

import (
  "bufio"
  "fmt"
  "os"
  "path/filepath"
)

func main() {

  path := os.Args[1]
  files := list(path)
  for idx := range files {
    var filename = files[idx]
    fmt.Println(filename)
    texts := readfile(filename)

    if texts[0] == "---" {
      continue
    }

    title := "title: " + texts[0]
    texts = append([]string{"---", "layout: default", title, "---", ""}, texts...)
    savefile(filename, texts)
  }
}

// 対象のファイルを取得する
func list(dir string) (matches []string) {
  files, _ := filepath.Glob(dir + "/*.markdown")
  files2, _ := filepath.Glob(dir + "/*.md")
  return append(files, files2...)
}

// ファイルを読み込んで配列にいれてくれる
func readfile(filename string) []string {
  fp, err := os.Open(filename)
  var ret []string

  if err != nil {
    panic(err)
  }

  scanner := bufio.NewScanner(fp)
  for scanner.Scan() {
    ret = append(ret, scanner.Text())
  }

  return ret
}

// 書き込み処理を行う
func savefile(filename string, texts []string) {
  var writer *bufio.Writer

  file, _ := os.OpenFile(filename, os.O_WRONLY, 0644)
  writer = bufio.NewWriter(file)

  for idx := range texts {
    writer.WriteString(texts[idx] + "\n")
  }

  writer.Flush()
}

実行の仕方としては、こんな感じです

$  go run replace.go ~/sfjp-doc-main/blog

簡単に実装できるし、スクリプト言語感覚で書けて、実行速度が高速なgolangってやっぱすごいなと思いました。
バッチ処理だったり、テキスト処理だったり、もっと積極的にgolangを取り入れる方が、様々な意味でプラスになると思ったので、公私共に今後は積極的にgolangでコード書いていこうと思います。

comments powered by Disqus