テキストファイルを1行ずつ読み取るには、File.ReadLines メソッドを使用します。
ファイルを1行ずつ読み取る方法
File.ReadLines メソッド の引数に ファイル名 を指定します。using System.Collections.Generic;
using System.IO;
IEnumerable<string> lines = File.ReadLines("ファイル名");
foreach (string line in lines)
{
// 変数 line に 1行ずつ、ファイル内容が格納される
}
- 結果は 配列 や リスト ではなく、 string型 の IEnumerable です。
- 読み取り結果 を foreach に渡してループすることで、1 行ずつ読み取ります。
- foreach でループする毎にファイルを読み取るため、メモリー使用量が少なくて済みます。
- 読み取り結果に改行コードは含まれません。
- 最終行の改行コードは無視されます。
- 空行は 長さゼロの文字列("") が返されます。
- 読み取りが完了すると、自動でファイルを閉じます。
小さいファイルしか読み取らないとき
File.ReadAllLines メソッド を使用すると、戻り値が 文字列の配列(string[]) になります。 File.ReadLines より便利に思えますが一度に全てのファイル内容を読み込むため、多くのメモリーを使用します。File.ReadAllLines メソッドの使い方
using System.IO;
string[] lines = File.ReadAllLines("ファイル名");
サンプルコード
File.ReadLines を使用して テキストファイルを読み取るusing System;
using System.Collections.Generic;
using System.IO;
try
{
// ファイルを 1行ずつ 読み取る
IEnumerable<string> lines = File.ReadLines(".\\test.txt");
// 行番号の表示用
int lineNo = 0;
// ファイルの行数分ループ
foreach (string line in lines)
{
// 行番号をカウントアップ
lineNo += 1;
// ファイルの内容を表示
Console.WriteLine($"{lineNo}行目: {line}");
}
}
catch (ArgumentNullException ex)
{
Console.WriteLine($"ファイル名が NULL です。({ex.Message})");
}
catch (ArgumentException ex)
{
Console.WriteLine($"ファイル名が空か、ファイル名に使用できない文字が含まれています。({ex.Message})");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"無効なファイルパスです。({ex.Message})");
}
catch (FileNotFoundException ex)
{
Console.WriteLine($"ファイルが見つかりません。({ex.Message})");
}
catch (PathTooLongException ex)
{
Console.WriteLine($"ファイル名が長すぎます。({ex.Message})");
}
catch (IOException ex)
{
Console.WriteLine($"I/O エラーが発生しました。({ex.Message})");
}
catch (System.Security.SecurityException ex)
{
Console.WriteLine($"アクセス許可がありません。({ex.Message})");
}
catch (Exception ex)
{
Console.WriteLine($"予期せぬエラーが発生しました。({ex.Message})");
}
検証環境
- .NET 5.0
- Microsoft Visual Studio Professional 2019 Version 16.9.4
- Microsoft Windows 10 Pro Version 20H2 OS Build 19042.964 Experience: Windows Feature Experience Pack 120.2212.2020.0