Go でファイルや標準入力からテキストを一行ずつ読む
bufio.Scanner
Go言語 (golang) ではbufio.Scanner
を使ってファイル/標準入力からテキストを一行ずつ読み込みます。
bufio.NewScanner
で *file.File
から Scanner
を作成し、Scan()
がファイルの末尾に達してfalse
を返すまで for ループを回します。
行の内容は Text()
でstirng
として取得できます。Text()
の返り値の末尾には改行文字('\n'
)は含まれないので改行文字を削除するためにstrings.Trim
を呼ぶ必要などもありません。
ファイルの終端に正常に到達したかを念の為に確かめたい場合は、s.Err()
をチェックして下さい。
正常にファイルの末尾まで読み込まれた場合はs.Err()
はnil
を返します。
func readLines(path string) {
f, err := os.Open(path)
if err != nil {
log.Fatal(err)
return
}
s := bufio.NewScanner(f)
for s.Scan() {
log.Print(strconv.Quote(s.Text()))
}
if s.Err() != nil {
// non-EOF error.
log.Fatal(s.Err())
}
}
標準入力から読む
標準入力から文字列を読み込む場合は、os.Open(...)
の代わりにos.Stdin
を利用します。
func readLines(path string) {
s := bufio.NewScanner(os.Stdin)
for s.Scan() {
log.Print(strconv.Quote(s.Text()))
}
if s.Err() != nil {
// non-EOF error.
log.Fatal(s.Err())
}
}
bufio.Reader
bufio.Scanner
の方がシンプルですが、bufio.Reader
を使って一行ずつファイルを読むことも出来ます。
bufio.Reader
を使う場合はReadLine()
ではなくてReadString('\n')
を使うという点に注意して下さい。
ReadString('\n')
の返り値の末尾には改行文字'\n'
が含まれるので必要ない場合はstrings.TrimLeft
などで改行文字を取り除く必要があります。
func readLines(f *file.File) {
r := bufio.NewReader(f)
for {
// line includes '\n'.
line, err := r.ReadString('\n')
if err == io.EOF {
break
} else if err != nil {
log.Fatal(err)
}
log.Print(strconv.Quote(line))
}
}
最終更新: 2015/8/4