0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[golang]改行コードをトリムして、1行単位にファイルを読み込む

Posted at

はじめに

[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を見直す。

参考

Goのbufio.Scannerは入力データの1行の長さが一定以上になるとスキャンをやめてしまう

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?