GO でファイルを 1 行ずつ効率的に読み取る方法

Wechuli Paul 2023年12月11日
  1. パッケージと必要なインポート
  2. Go で行ごとにファイルを読み取る
  3. Go で行ごとにファイルを読み取るための完全なコード
  4. Go で Scanner の動作を設定する
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 が呼び出されたときに生成された最新のトークンを読み取ります。

ファイルの読み取り中にエラーが発生した場合、それらは新しい ScannerErr() メソッドを呼び出すことで処理できます。これにより、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 関数があり、指定されたバイトスライスをスキャナーがどのように分割するかを決定します。デフォルトの SplitFuncScanLines で、テキストの各行を返し、末尾の行末マーカーを取り除いています。

たとえば、次のコードスニペットに示すように、単語を使用して分割できます。

scanner.Split(bufio.ScanWords)  //configure how the scanner behaves

関連記事 - Go File