Goでファイルを一行ずつ読み込む
Daniel Hayes
Full-Stack Engineer · Leapcell

Key Takeaways
bufio.Scanner
を使用して、効率的な行ごとのファイル読み込みを行います。- 予期しない障害を避けるために、潜在的なエラーを適切に処理します。
Scanner.Buffer()
を使用して、長い行のためにバッファサイズを調整します。
ファイルを一行ずつ読み込むことは、プログラミングにおいて一般的なタスクであり、特にテキストファイルやログを処理する際に重要です。Goでは、バッファリングされたI/O操作を提供するbufio
パッケージを使用して、これを効率的に実現できます。この記事では、Goを使用してファイルを行ごとに読み込むプロセスについて説明します。
bufio.Scanner
の使用
bufio.Scanner
は、テキスト行などのデータを読み取るための便利なツールです。入力データを読み取り、指定された区切り文字に基づいてトークンに分割します。デフォルトでは改行文字が使用されるため、行ごとの読み込みに最適です。
bufio.Scanner
を使用してファイルを行ごとに読み込む方法は次のとおりです。
package main import ( "bufio" "fmt" "log" "os" ) func main() { // ファイルを開く file, err := os.Open("path/to/your/file.txt") if err != nil { log.Fatalf("ファイルのオープンに失敗しました: %s", err) } defer file.Close() // ファイルの新しいScannerを作成 scanner := bufio.NewScanner(file) // 各行を反復処理 for scanner.Scan() { line := scanner.Text() // ここで行を処理 fmt.Println(line) } // スキャン中のエラーをチェック if err := scanner.Err(); err != nil { log.Fatalf("ファイル読み取りエラー: %s", err) } }
この例では:
os.Open
を使用してファイルを開きます。この操作中に発生する可能性のあるエラーを処理することが重要です。bufio.Scanner
がファイルに対して作成されます。スキャナーはデフォルトで入力を行に分割します。scanner.Scan()
を使用して各行を反復処理します。scanner.Text()
メソッドは、現在の行を文字列として返します。- ループ後、
scanner.Err()
を使用してスキャンプロセス中にエラーが発生したかどうかを確認します。
長い行の処理
bufio.Scanner
にはデフォルトのバッファサイズがあり、非常に長い行には十分でない場合があります。64KBを超える行が予想される場合は、Scanner.Buffer
メソッドを使用してバッファサイズを調整できます。
scanner := bufio.NewScanner(file) buf := make([]byte, 0, 1024*1024) // 1 MBのバッファ scanner.Buffer(buf, 1024*1024)
これにより、バッファが1MBに設定され、必要に応じてより長い行に対応できます。
結論
Goでファイルを行ごとに読み込むのは、bufio.Scanner
を使用すると簡単です。各行を処理するためのシンプルで効率的な方法を提供し、ログの読み取りやテキストファイルの処理などの一般的なタスクを処理します。常に潜在的なエラーを適切に処理し、異常に長い行が含まれる可能性のあるファイルを扱う場合は、バッファサイズを調整するようにしてください。
FAQs
デフォルトでは改行文字(\n
)です。
Scanner.Buffer()
を使用して、バッファサイズを大きくします。
scanner.Err()
を使用して、エラーをチェックして適切に処理します。
Leapcellでは、Goプロジェクトのホスティングに最適な選択肢です。
Leapcellは、Webホスティング、非同期タスク、およびRedisのための次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、またはRustで開発できます。
無料で無制限のプロジェクトをデプロイ
- 使用量に対してのみ支払い - リクエストも料金も発生しません。
比類のないコスト効率
- アイドル料金なしの従量課金制。
- 例:25ドルで、平均応答時間60ミリ秒で694万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的なUI。
- 完全に自動化されたCI/CDパイプラインとGitOps統合。
- 実用的な洞察のためのリアルタイムのメトリックとロギング。
簡単なスケーラビリティと高性能
- 簡単な同時実行を処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ - 構築に集中してください。
詳しくはドキュメントをご覧ください。
Xでフォローしてください:@LeapcellHQ