C#でファイルの行単位で読み書きするテクニックを徹底解説!初心者でもわかる入門ガイド
生徒
「先生、C#でファイルの内容を一行ずつ読み込んだり書いたりする方法ってありますか?」
先生
「いい質問ですね。C#では、ファイルを行単位で読み書きするための便利なメソッドが用意されています。これを使えば、テキストファイルを簡単に扱うことができますよ。」
生徒
「行単位って、1行ずつ順番に読み取るということですか?」
先生
「その通りです。たとえば、日記のように1行ずつ内容を処理したいときなどに役立ちます。では、実際のコードを見ながら学んでいきましょう!」
1. C#でファイルを行単位で読み込む基本
C#では、ファイルの内容を1行ずつ読み込む方法として、主に次の2つがよく使われます。
File.ReadLines()メソッドを使う方法StreamReaderクラスを使う方法
どちらもテキストファイル(.txtなど)を行ごとに読み取ることができますが、目的に応じて使い分けます。
2. File.ReadLinesを使って簡単に読む方法
File.ReadLines()は、指定したファイルから1行ずつ読み取るメソッドです。ファイル全体を一度に読み込まないため、大きなファイルでも効率よく処理できます。
例えば、以下のようなファイルがあるとします。
apple
banana
cherry
このファイルを1行ずつ読み取って画面に表示するコードは次の通りです。
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "sample.txt";
foreach (string line in File.ReadLines(filePath))
{
Console.WriteLine(line);
}
}
}
このコードを実行すると、次のように出力されます。
apple
banana
cherry
ポイント:
「foreach」を使うことで、1行ずつ順番に処理することができます。ファイル全体を一度に読み込むFile.ReadAllLines()とは違い、メモリの消費を抑えることができます。
3. StreamReaderを使った行単位の読み込み
もう少し細かく制御したい場合は、StreamReaderクラスを使います。このクラスは「ファイルストリーム」と呼ばれる仕組みで、ファイルを1行ずつ順に読み込むことができます。
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "sample.txt";
using (StreamReader reader = new StreamReader(filePath))
{
string? line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
}
using文は、ファイルを開いたあと自動的に閉じてくれる便利な構文です。これにより、ファイルを閉じ忘れてしまうミスを防げます。
上記のコードも、結果は次のように出力されます。
apple
banana
cherry
この方法は、行ごとに条件分岐や検索などの処理を行いたいときに便利です。
4. ファイルへ行単位で書き込む方法
次は、C#でファイルに1行ずつ書き込む方法を紹介します。こちらも「追記する(append)」か「新規で書く(overwrite)」かによって使い方が少し変わります。
まずは、StreamWriterを使って新しいファイルに書き込む例です。
using System;
using System.IO;
class Program
{
static void Main()
{
string filePath = "output.txt";
using (StreamWriter writer = new StreamWriter(filePath))
{
writer.WriteLine("りんご");
writer.WriteLine("ばなな");
writer.WriteLine("さくらんぼ");
}
Console.WriteLine("ファイルの書き込みが完了しました。");
}
}
実行すると、「output.txt」に次のような内容が書き込まれます。
りんご
ばなな
さくらんぼ
もし既存のファイルに追記したい場合は、StreamWriterの第2引数にtrueを指定します。
using (StreamWriter writer = new StreamWriter(filePath, true))
{
writer.WriteLine("みかん");
}
これで、既存のファイルの最後に「みかん」が追加されます。
5. 実用例:ファイルの行を加工して新しいファイルに書き出す
ここまで学んだ「読み込み」と「書き込み」を組み合わせると、ファイルの内容を加工して別のファイルに出力することもできます。
次のサンプルでは、読み込んだ各行を大文字に変換して新しいファイルに書き込んでいます。
using System;
using System.IO;
class Program
{
static void Main()
{
string inputPath = "sample.txt";
string outputPath = "result.txt";
using (StreamReader reader = new StreamReader(inputPath))
using (StreamWriter writer = new StreamWriter(outputPath))
{
string? line;
while ((line = reader.ReadLine()) != null)
{
writer.WriteLine(line.ToUpper());
}
}
Console.WriteLine("変換と書き込みが完了しました。");
}
}
このように、C#のファイル操作では行単位で処理を行うことで、ログの分析やテキスト整形など、さまざまな応用が可能になります。
6. 行単位処理を使いこなそう
ファイルを1行ずつ読み書きするテクニックは、C#のファイル操作の中でも非常に基本的で重要なスキルです。
File.ReadLines()で簡単に読み取ったり、StreamReaderやStreamWriterで細かく制御したりと、目的に応じて柔軟に使い分けることで、効率的で安全なファイル処理ができます。
C#を使ったテキスト処理の基礎として、しっかり理解しておくと後の学習にも役立ちます。
まとめ
ここまで、C#でファイルを一行ごとに読み書きする基本的なテクニックをじっくり学んできました。文章ファイルを扱う処理は、アプリケーション開発だけでなく、ログ解析やデータ整形、設定ファイルの管理など、多くの場面で利用される重要な機能です。初心者の段階でこの操作をしっかり理解しておくと、後の学習が格段に進めやすくなります。とくに、File.ReadLines()を用いたシンプルな読み取りや、StreamReaderを使った細かい制御、さらにStreamWriterでの行単位書き込みは、基本ながら応用範囲も広い大切な知識です。実際の開発では、ファイルを一度に読み込まず少しずつ処理することが効率向上につながることもよくあります。そのため、今回学んだ方法を場面に応じて使い分けられるようにしておくと、より柔軟なプログラミングが可能になります。
また、行単位で処理する利点として、必要な部分だけを順に確認したり、条件に合うデータだけを抽出したりすることが容易になるという点があります。大量の情報を扱うときでもメモリの消費を抑えることができ、プログラム全体の安定性も保ちやすくなります。これは初心者だけでなく、ある程度経験を積んだプログラマにも役立つ重要な考え方であり、C#での開発を続けていくうえで大いに役立つはずです。
以下に、学んだ内容をまとめた簡単なサンプルコードを掲載しておきます。これまでの知識を組み合わせた内容なので、実際に手を動かして動作を確認してみると理解がさらに深まります。
using System;
using System.IO;
class SummarySample
{
static void Main()
{
string input = "input.txt";
string output = "output_summary.txt";
using (StreamReader reader = new StreamReader(input))
using (StreamWriter writer = new StreamWriter(output))
{
string? line;
while ((line = reader.ReadLine()) != null)
{
if (!string.IsNullOrWhiteSpace(line))
{
writer.WriteLine($"行データ: {line}");
}
}
}
Console.WriteLine("まとめサンプルの処理が完了しました。");
}
}
このサンプルでは、空行を除きながら一行ずつ読み込み、加工した文字列を別のファイルへ書き込んでいます。行単位で読み取り、行単位で書き出す基本構造を踏まえているため、今回の理解の確認として最適です。実際の開発環境で同様の仕組みを使う場面は多く、特にログ管理やテキスト加工ツールなどで役立つ考え方が含まれています。
生徒
「先生、行単位の読み書きって意外と簡単なんですね。特にFile.ReadLines()とStreamReaderの違いが分かってきました!」
先生
「そうですね。目的に合わせて使い分けられるようになると、一気にできることが広がりますよ。慣れてくると、ファイルを扱う処理はとても便利に感じられるはずです。」
生徒
「行単位で処理することで、大きなファイルでも軽く扱える理由もよく理解できました。次は条件付きで行を抽出する処理にも挑戦してみたいです!」
先生
「その意気です。今回学んだ基礎を応用すれば、もっと高度なテキスト処理にも挑戦できますよ。引き続き練習していきましょう。」