GO でファイルを 1 行ずつ効率的に読み取る方法
ファイル I/O
、特にファイルの読み取りと書き込みは、プログラミング言語のかなり一般的な機能です。多くの場合、ファイルを 1 行ずつ読み取る必要があります。GO は、基本的にバッファード I/O
を実装する bufio
パッケージを提供しています。bufio
は、特にテキストファイルの読み取りと書き込みに役立つタイプと関数を提供します。
パッケージと必要なインポート
package main
import(
"fmt"
"bufio"
"log"
"os"
)
GO 標準ライブラリからいくつかのインポートが必要になります:-
os
- OS 機能へのプラットフォームに依存しないインターフェース用fmt
- フォーマット済み I/O 機能の実装log
- 標準ログパッケージbufio
- バッファード I/O をサポート
Go で行ごとにファイルを読み取る
ファイルを読み取る前に、まず、ファイルへのポインタータイプを返す os.Open()
関数を使用してファイルを開く必要があります。コードスニペットに示されている test.txt
ファイルは事前に存在している必要があります(ファイルの場所へのパスを入力します)。
bufio.NewScanner(file)
関数は、ファイルの読み取りをサポートする関数を持つスキャナータイプを返します。
ファイルを 1 行ずつ読み取るには、新しい Scanner
-Scan
で 2つのメソッドを使用する必要があります。これにより、スキャナーが新しいトークン(この場合は新しい行)と Text
(または Byte
)は、Scan
が呼び出されたときに生成された最新のトークンを読み取ります。
ファイルの読み取り中にエラーが発生した場合、それらは新しい Scanner
で Err()
メソッドを呼び出すことで処理できます。これにより、Scanner
で発生した最初のファイルの終わり以外のエラーが返されます。
func main(){
// open the file
file, err := os.Open("test.txt")
//handle errors while opening
if err != nil {
log.Fatalf("Error when opening file: %s", err)
}
fileScanner := bufio.NewScanner(file)
// read line by line
for fileScanner.Scan() {
fmt.Println(fileScanner.Text())
}
// handle first encountered error while reading
if err := fileScanner.Err(); err != nil {
log.Fatalf("Error while reading file: %s", err)
}
file.Close()
}
Go で行ごとにファイルを読み取るための完全なコード
行ごとにファイルを読み取るための main.go
の完全なコードを以下に示します。
次のように入力する必要があります。
$ go run main.go
ドターミナルでプログラムを実行します。
package main
import (
"bufio"
"fmt"
"log"
"os"
)
func main() {
// open the file
file, err := os.Open("test.txt")
//handle errors while opening
if err != nil {
log.Fatalf("Error when opening file: %s", err)
}
fileScanner := bufio.NewScanner(file)
// read line by line
for fileScanner.Scan() {
fmt.Println(fileScanner.Text())
}
// handle first encountered error while reading
if err := fileScanner.Err(); err != nil {
log.Fatalf("Error while reading file: %s", err)
}
file.Close()
}
Go で Scanner
の動作を設定する
Scanner
タイプには、[SplitFunc]関数を受け入れる Split
関数があり、指定されたバイトスライスをスキャナーがどのように分割するかを決定します。デフォルトの SplitFunc
は ScanLines
で、テキストの各行を返し、末尾の行末マーカーを取り除いています。
たとえば、次のコードスニペットに示すように、単語を使用して分割できます。
scanner.Split(bufio.ScanWords) //configure how the scanner behaves