C#でアプリケーションを開発する際、ファイルからのデータ読み込みは欠かせない基本機能の1つです。設定ファイルの読み取りやログ解析、CSVデータの取り込みなど、日常的にファイル操作を行うシーンは非常に多く存在します。
しかし、ファイルの種類や目的に応じて適切な読み込み方法を選ばなければ、パフォーマンスや信頼性に悪影響を及ぼすこともあるでしょう。
この記事では、C#でのファイル読み込み方法について体系的に解説します。
目次
閉じる
1.C#でファイルを読み込む方法と流れ
C#においてファイルからデータを読み込む操作は、業務自動化やログ解析、データ分析などさまざまな場面で頻繁に使われます。本章では、ファイル読み込みの基本構文とその全体的な流れを解説していきます。
ファイル操作で使う基本的なクラス
C#では、主に以下のクラスを使用してファイル読み込みを行います。
System.IO.File
System.IO.FileInfo
System.IO.StreamReader
これらのクラスはすべて、System.IO名前空間に含まれているため、冒頭で以下の記述を忘れないようにしましょう。
using System.IO; |
C# ファイル全体を一括で読み込む
最も簡単なファイル読み込みの方法として、File.ReadAllTextがあります。これは、テキストファイル全体の内容を一括で1つの文字列として読み込むメソッドです。
string text = File.ReadAllText("sample.txt"); Console.WriteLine(text); |
C# 1行ずつファイルを読み込む
ファイルを1行ずつ処理したい場合には、File.ReadAllLinesが適しています。
string[] lines = File.ReadAllLines("sample.txt"); foreach (string line in lines) { Console.WriteLine(line); } |
C# バイナリとしてファイルを読み込む
画像やPDF、音声ファイルなどバイナリ形式のファイルを扱う場合は、File.ReadAllBytes を使用します。
byte[] data = File.ReadAllBytes("image.jpg"); Console.WriteLine($"バイト数: {data.Length}"); |
using構文を使った安全なファイル読み込み
StreamReaderを使用する場合、ファイルのクローズ処理が必要です。そのため、C#ではusing構文がよく使われます。
using (StreamReader reader = new StreamReader("sample.txt")) { string line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } |
「ファイルが存在しない」というエラーを回避する方法
ファイルが存在しない場合に読み込みを試みると、FileNotFoundExceptionが発生します。以下のように、存在チェックを事前に行いましょう。
if (File.Exists("sample.txt")) { string text = File.ReadAllText("sample.txt"); Console.WriteLine(text); } else { Console.WriteLine("ファイルが見つかりません。"); } |
2.C# CSVファイルを読み込む方法
CSVファイルは業務データや設定情報、エクスポートファイルなど多くの場面で使用されています。C#では、シンプルな手法からライブラリを使った高度な方法まで、さまざまな方法でCSVを読み込むことが可能です。
CSVの基本構造と注意点
CSVファイルはカンマ区切りのテキスト形式で構成され、行がレコード、列がフィールドに対応します。
CSVを扱う場合の注意点は下記の通りです。
値にカンマが含まれる場合は「"」で囲む必要がある
改行や空白行を含むことがある
文字コード(UTF-8 / Shift-JIS)に注意
Splitを使った方法
最もシンプルな方法は、行を読み込んで Split(',')で分割する方法です。
using (StreamReader reader = new StreamReader("sample.csv")) { string line; while ((line = reader.ReadLine()) != null) { string[] fields = line.Split(','); Console.WriteLine($"ID: {fields[0]}, 名前: {fields[1]}, メール: {fields[2]}"); } } |
CsvHelperライブラリを使った方法
業務レベルのCSV処理には、CsvHelperライブラリの使用がおすすめです。NuGetからインストールして使用できます。
using (var reader = new StreamReader("sample.csv")) using (var csv = new CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture)) { var records = csv.GetRecords<User>().ToList(); foreach (var user in records) { Console.WriteLine($"名前: {user.Name}, メール: {user.Email}"); } }
{ public int ID { get; set; } public string Name { get; set; } public string Email { get; set; } } |
CSV読み込みのよくあるエラーと対策
CSVファイルを読み込む際には、思わぬエラーに遭遇することがあります。ここでは、C#でよく発生する代表的なエラーとその対処法を紹介します。
エラー内容 | 原因例 | 対策 |
---|---|---|
IndexOutOfRangeException | フィールド数が予想より少ない | fields.Length を確認してから処理する |
文字化け | ファイルのエンコーディングが合っていない | new StreamReader(path, Encoding.GetEncoding("Shift_JIS")) などで明示指定 |
ダブルクォートの扱いが不正 | "山田,太郎" のような値の処理ミス | CsvHelperや正規表現での対応を検討 |
CSVファイルを読み込む際に最もよく見られるエラーの1つが、配列のインデックス超過です。例えば、Split(',')で分割したフィールド数が期待よりも少ない場合にIndexOutOfRangeExceptionが発生します。
これを防ぐには、処理前にfields.Lengthを確認して必要な数があるかをチェックすることが重要です。
また、日本語を含むCSVファイルでは、文字コードの違いによって文字化けが発生することがあります。特にWindows環境で生成されたCSVファイルはShift-JISで保存されていることが多いため、StreamReaderで明示的に文字コードを指定することで回避できます。
さらに、値にカンマや改行が含まれている場合、それらを適切に処理できないと読み込みエラーの原因となります。こうした複雑なCSV構文を正確に処理するには、CsvHelperのようなCSV専用ライブラリの活用が効果的です。
これらのエラーを未然に防ぎ、安定した読み込み処理を行うためにも、エラーハンドリングと入力検証の仕組みを事前に組み込むことが重要です。
関連記事
C#の正規表現|エスケープ処理や抽出、数字、match、ismatchなど実務で使える正規表現一覧
【C#】Listと配列との違いや初期化・削除・要素数取得・型指定なしの使い方を紹介
3.C# ファイルダイアログを使った読み込み方法
コンソールアプリケーションではファイルパスをコード内で直接指定することが多いですが、GUIアプリケーション(Windows FormsやWPF)では、ユーザーがファイルを選択できるようにすることが求められます。その際に便利なのが、ファイルダイアログ(OpenFileDialog)です。
この章では、OpenFileDialogを使用してユーザーにファイルを選ばせ、そのファイルを読み込む一連の流れを実装例とともに解説します。
OpenFileDialogとは?
OpenFileDialogは、Windowsの標準ダイアログを表示し、ファイルの選択を可能にするコンポーネントです。C#でWindows FormsアプリケーションやWPFアプリケーションを開発する際に利用されます。主な用途は下記の通りです。
ユーザーにファイルを自由に選択させたいとき
CSVやテキストファイルなどの読み込み対象を都度指定したい場合
複数ファイル選択やフィルタリングにも対応可能
Windows Formsでの基本的な使い方
以下は、Windows Formsでファイルダイアログを使ってCSVファイルを選び、内容を表示する例です。
private void buttonOpenFile_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "ファイルを選択してください"; openFileDialog.Filter = "CSVファイル (*.csv)|*.csv|テキストファイル (*.txt)|*.txt|すべてのファイル (*.*)|*.*"; openFileDialog.Multiselect = false;
{ string filePath = openFileDialog.FileName; string content = File.ReadAllText(filePath, Encoding.UTF8); MessageBox.Show(content, "読み込んだファイルの内容"); } } |
こちらのコードのポイントは下記の通りです。
Titleプロパティでダイアログのタイトルを指定
Filterで拡張子を限定し、CSVなど特定の形式だけを対象にできる
ShowDialog()の戻り値でキャンセル操作にも対応可能
複数ファイルの選択にも対応
Multiselectプロパティをtrueに設定することで、複数ファイルの選択にも対応できます。
openFileDialog.Multiselect = true; |
選択されたファイルは、openFileDialog.FileNamesで配列として取得可能です。例えば、複数のCSVを一括で読み込んで統合処理を行うといった用途に活用できます。
ファイル選択時の注意点とエラー対策
ファイルダイアログを使用する場合にも、以下のようなエラー対策を忘れずに実装しておくことが大切です。
ファイルの存在確認:存在しないパスが指定される可能性もある
エンコーディング指定:読み込むファイルの文字コードに注意(Shift-JISなど)
例外処理:ファイルがロックされていたり、アクセス権がない場合はIOExceptionなどが発生
try { string content = File.ReadAllText(filePath, Encoding.GetEncoding("Shift_JIS")); MessageBox.Show(content); } catch (Exception ex) { MessageBox.Show("ファイルの読み込み中にエラーが発生しました。\n" + ex.Message); } |
関連記事
C# foreach完全ガイド|基本構文からコレクション操作・LINQ連携・ループ制御まで徹底解説
4.C# 高速なファイル読み込みを実現する方法
大量のログファイルやビッグデータを扱うシステムでは、ファイル読み込みの速度が処理全体のパフォーマンスを左右します。この章では、C#で高速にファイルを読み込むためのテクニックや非同期処理、最適化のポイントを実践的に解説します。
読み込み速度に影響する主な要因
ファイル読み込みの速度に影響を与える要素は、以下の通りです。
ファイルサイズ:読み込むデータ量が多いほど時間がかかる
ディスクI/O性能:HDDとSSDでは読み込み速度が大きく異なる
読み込み方式:逐次読み込みと一括読み込みではパフォーマンスに差が出る
文字エンコーディング:文字コード変換にもCPUリソースを使う
これらを理解した上で、適切な手法を選ぶことが高速化への第一歩です。
非同期処理でファイル読み込みを高速化
UIスレッドをブロックせずに読み込みを行いたい場合は、非同期メソッド(async/await)を活用します。これにより、他の処理と並行してファイル読み込みが進められるため、特にUIアプリケーションでの体感速度が向上します。
using (StreamReader reader = new StreamReader("largefile.txt")) { string? line; while ((line = await reader.ReadLineAsync()) != null) { Console.WriteLine(line); } } |
バッファサイズを最適化する
StreamReaderやFileStreamは内部的にバッファ(データを一時保存する領域)を使用しています。大量データを扱う際には、バッファサイズを明示的に指定することで読み込みの効率を向上させることができます。
using (FileStream fs = new FileStream("largefile.txt", FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize: 8192)) using (StreamReader reader = new StreamReader(fs)) { string? line; while ((line = reader.ReadLine()) != null) { Console.WriteLine(line); } } |
関連記事
【C#】DateTime完全ガイド:初期化・文字列変換から年月日・時間・ミリ秒操作まで詳細解説
5.C# ファイル書き込みの方法
C#におけるファイル操作では、読み込みと書き込みは表裏一体の関係にあります。読み込んだデータを加工して保存したり、ログを追記するなど、書き込み処理は多くの場面で活用されます。
この章ではファイルの書き込み処理の基本から、読み込みとの連携方法まで、実例を交えてわかりやすく解説します。
ファイル書き込みの基本
ファイルに一括で文字列を書き込むには、File.WriteAllTextやFile.WriteAllLinesが便利です。
WriteAllText の例(文字列全体を書き込み)
string content = "これはファイルへの書き込みテストです。"; File.WriteAllText("output.txt", content); |
WriteAllLines の例(行ごとの書き込み)
string[] lines = { "1行目", "2行目", "3行目" }; File.WriteAllLines("output.txt", lines); |
どちらも、ファイルが存在しない場合は自動で生成されます。既存ファイルがある場合は上書きされる点に注意しましょう。
ファイルを追記する
ログファイルなどにデータを追記したい場合は、AppendAllTextまたはAppendAllLinesを使います。
File.AppendAllText("log.txt", "新しいログ行を追加しました。\n"); |
これにより、既存の内容を保持したまま末尾に新しいデータを加えることができます。
StreamWriter を使った書き込み処理
細かく制御したい場合には、StreamWriterを使うのが一般的です。
using (StreamWriter writer = new StreamWriter("output.txt")) { writer.WriteLine("1行目"); writer.WriteLine("2行目"); } |
読み込んだ内容を加工して書き込む例
ファイルからデータを読み込み、整形して別のファイルに書き出す、といった処理はよくあるパターンです。
string[] lines = File.ReadAllLines("input.csv"); List<string> output = new List<string>();
{ var fields = line.Split(','); output.Add($"ID:{fields[0]} | 名前:{fields[1]}"); }
|
このように、読み込み→加工→書き込みの流れは、データ変換や帳票作成などにも応用できます。
関連記事
C#とは?基本文法や特徴、メリット、開発分野まで初心者に必要な情報をわかりやすく解説
6.まとめ
この記事ではC#におけるファイル読み込み処理について、基本構文からCSVやバイナリの読み込み、高速化の手法などを体系的に解説しました。用途別に最適な読み込み方法を選ぶことで、処理の効率性と安全性が向上します。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。