はじめに
コマンドラインツールを作るのは難しそうなイメージがありましたが、案外簡単に作れてしまいました。
コード
main.go
package main
import (
"bufio"
"flag"
"fmt"
"os"
"strings"
)
func main() {
// コマンドライン引数の定義
filename := flag.String("f", "", "検索対象のファイル名")
word := flag.String("w", "", "検索する単語")
flag.Parse()
// 引数のバリデーション
if *filename == "" || *word == "" {
fmt.Println("使用方法: -f <ファイル名> -w <検索単語>")
flag.PrintDefaults()
os.Exit(1)
}
// ファイルを開く
file, err := os.Open(*filename)
if err != nil {
fmt.Printf("ファイルを開けませんでした: %v\n", err)
os.Exit(1)
}
defer file.Close()
// 単語の出現回数をカウント
scanner := bufio.NewScanner(file)
count := 0
for scanner.Scan() {
count += strings.Count(strings.ToLower(scanner.Text()), strings.ToLower(*word))
}
if err := scanner.Err(); err != nil {
fmt.Printf("ファイル読み込み中にエラーが発生しました: %v\n", err)
os.Exit(1)
}
// 結果を表示
fmt.Printf("ファイル '%s' 内の '%s' の出現回数: %d\n", *filename, *word, count)
}
サンプルファイル
test.txt
word
wordword
word&word
wrodword
動かしてみる
go run main.go -f test.txt -w word
ファイル 'test.txt' 内の 'word' の出現回数: 6
引数が正しくない場合
コマンドラインの使用方法やオプションの説明が表示されます。
go run main.go
使用方法: program -f <ファイル名> -w <検索単語>
-f string
検索対象のファイル名
-w string
検索する単語
exit status 1