概要
フォルダに含まれる特定の拡張子のファイルだけを処理したいときには,filepath.Glob(pattern string)
が超便利!
サンプル
ディレクトリを指定してその下のcsvファイルを列挙する
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
targetDir := "."
if len(os.Args) == 2 {
targetDir = os.Args[1]
}
pattern := targetDir + "/*.csv"
files, err := filepath.Glob(pattern)
if err != nil {
panic(err)
}
for _, file := range files {
fmt.Println(file)
}
}
実行例
% go run filepath_sample.go ../kagome/dic/_converter/mecab-ipadic-2.7.0-20070801
../kagome/dic/_converter/mecab-ipadic-2.7.0-20070801/Adj.csv
../kagome/dic/_converter/mecab-ipadic-2.7.0-20070801/Adnominal.csv
../kagome/dic/_converter/mecab-ipadic-2.7.0-20070801/Adverb.csv
../kagome/dic/_converter/mecab-ipadic-2.7.0-20070801/Auxil.csv
../kagome/dic/_converter/mecab-ipadic-2.7.0-20070801/Conjunction.csv
…snip
ディレクトリの指定にも * が使える!
2階層下のフォルダのファイルを列挙する
package main
import (
"fmt"
"path/filepath"
)
func main() {
pattern := "./*/*/*.csv"
files, err := filepath.Glob(pattern)
if err != nil {
panic(err)
}
for _, file := range files {
fmt.Println(file)
}
}
こんな感じのディレクトリ構造で実行すると・・・
% tree a
a
├── a.csv
├── b
│ └── b.csv
└── c
└── c.csv
% go run filepath_sample.go
a/b/b.csv
a/c/c.csv
おお!便利.