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