はじめに
[golang]改行コードを維持して、1行単位にファイルを読み書きするを調べていた過程で、改行コードをトリムしたい場合も自分なりに整理したので備忘がてら記載します。
ソース
main
package main
import (
"bufio"
"fmt"
"log"
"os"
)
const (
initialTokenSize = 4096
maxTokenSize = 500 * 1024 // scanner.Err()でエラーになる場合、ここの数字を増やす
)
func main() {
// 読み込みたいファイルの指定
file, err := os.Open("./file.txt")
if err != nil { log.Fatal(err) }
defer file.Close()
scanner := bufio.NewScanner(file)
buf := make([]byte, initialTokenSize)
//bufのサイズが足りなかった場合、maxTokenSizeまでバッファを拡大してスキャンする。
scanner.Buffer(buf, maxTokenSize)
for scanner.Scan(){
// 改行をトリムした文字列は、scanner.Text()にて取得できる
fmt.Println(scanner.Text())
}
// bufferが足りなかった場合などは、scanner.Err()でエラーを検出できる
// このエラーハンドリングをしていないコードも結構あるので注意
err = scanner.Err()
if err != nil { log.Fatal(err) }
}
解説
改行をトリムする場合は、ReadLine()とScanner.Scan()とあるがScannerの方がシンプルで好みなのでこちらを採用。
Scanner.Scan()の問題点として、1行がMaxScanTokenSize(64 * 1024 バイト)を超えるとエラーになってしまう。したがって、Scanner.Buffer()を使用して、バッファが足りない場合はmaxTokenSizeまでバッファを拡大するよう指定する。
それでもバッファが足りない場合はScanner.err()でエラーとなるので、maxTokenSizeを見直す。