C#開発者にとって、テキストファイルを行単位で効率的に読み込むことは非常に重要なスキルです。ログの処理、設定ファイルの解析、データセットの分析など、どのような方法を選択するかは、パフォーマンスとリソース使用量に大きな影響を与えます。この記事では、3つの一般的なアプローチを紹介し、それぞれの長所と短所を明らかにすることで、特定のニーズに最適な手法を選択するのに役立てます。
目次
File.ReadLines()
の使用
File.ReadLines()
メソッドは、特に大規模なファイルの場合、一般的に最も効率的で便利なオプションです。IEnumerable<string>
を返すため、一度にすべてのコンテンツをメモリに読み込むことなく、ファイルを行単位で処理します。この遅延読み込みにより、大規模なデータセットを扱う際のOutOfMemoryException
エラーを回避できます。
using System;
using System.IO;
using System.Linq;
public class ReadLinesExample
{
public static void Main(string[] args)
{
string filePath = "myFile.txt";
try
{
foreach (string line in File.ReadLines(filePath))
{
Console.WriteLine(line);
//各行をここで処理します
}
}
catch (FileNotFoundException)
{
Console.WriteLine($"ファイルが見つかりません: {filePath}");
}
catch (Exception ex)
{
Console.WriteLine($"エラーが発生しました: {ex.Message}");
}
}
}
File.ReadAllLines()
の使用
File.ReadAllLines()
は、よりシンプルな構文で、すべての行を文字列配列に読み込みます。ただし、このアプローチはファイル全体をメモリに読み込むため、大規模なファイルでは非効率的で、問題となる可能性があります。メモリ消費量が大きな懸念事項にならない小さなファイルに最適です。
using System;
using System.IO;
public class ReadAllLinesExample
{
public static void Main(string[] args)
{
string filePath = "myFile.txt";
try
{
string[] lines = File.ReadAllLines(filePath);
foreach (string line in lines)
{
Console.WriteLine(line);
//各行をここで処理します
}
}
catch (FileNotFoundException)
{
Console.WriteLine($"ファイルが見つかりません: {filePath}");
}
catch (Exception ex)
{
Console.WriteLine($"エラーが発生しました: {ex.Message}");
}
}
}
StreamReader.ReadLine()
の使用
StreamReader.ReadLine()
は、最も細かい制御を提供します。ループを使用して一度に一行ずつ読み込み、次の行を読み込む前に各行のカスタム処理を行うことができます。このメソッドでは、using
ステートメントを使用してStreamReader
を適切に破棄することで、明示的なリソース管理が必要です。
using System;
using System.IO;
public class StreamReaderExample
{
public static void Main(string[] args)
{
string filePath = "myFile.txt";
try
{
using (StreamReader reader = new StreamReader(filePath))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
//各行をここで処理します
}
}
}
catch (FileNotFoundException)
{
Console.WriteLine($"ファイルが見つかりません: {filePath}");
}
catch (Exception ex)
{
Console.WriteLine($"エラーが発生しました: {ex.Message}");
}
}
}
適切なメソッドの選択
ほとんどのシナリオ、特に大規模なファイルを取り扱う場合は、その効率性と使いやすさから、File.ReadLines()
が推奨されるアプローチです。File.ReadAllLines()
は小さなファイルにのみ適しています。StreamReader.ReadLine()
はより多くの制御を提供しますが、より注意深いリソース管理が必要です。
ファイルが見つからないエラーなど、潜在的な例外を適切に処理するための堅牢なエラー処理を常に含めることを忘れないでください。