C#でCSVファイル読み込みをするには?基本コードと注意点を解説

[PR]

C#

プログラミングで「C# CSV ファイル 読み込み」を調べているなら、単にCSVを開くだけでなく、エラー回避、文字コード、値の中の区切り文字(カンマ等)、リッチなライブラリ利用まで、幅広く理解したいはずです。この記事では基礎から応用、最新のライブラリや開発現場で役立つ注意点までを網羅。コード例や比較表を交え、読み手がすぐに実践できる知識を提供します。

目次

C# CSV ファイル 読み込みの基本方法

CSVとは「Comma Separated Values」の略で、データをテキスト形式で区切って保存するフォーマットです。C#でCSVファイルを読み込む基本ステップは、まずファイルを読み込む手段を確保し、その後行毎にデータを分割して扱います。小規模なデータならば標準のクラスで十分ですが、データ量が多かったり複雑なCSVを処理する場合は、ライブラリを使うほうが安全で効率的です。

代表的な方法として、StreamReaderを使って一行ずつ読み、Splitで区切るという基本的なコードがあります。簡潔なのが利点ですが、「値にカンマが含まれる」「引用符で囲まれている」「改行を含む」などの仕様を満たす必要があるCSVには対処できません。そこで、TextFieldParser等のクラスや、外部のCSV処理ライブラリが登場します。

File.ReadAllLines+Splitでの読み込み

最もシンプルな方法は、File.ReadAllLinesでファイル全体を文字列配列に読み込み、それぞれの行をSplitで分割する形です。小さなファイルや簡単なデータの処理には適しています。コードは理解しやすく、依存ライブラリも不要です。

ただしこの方法は、大きなファイルではメモリ消費が激しくなる可能性があります。加えて、値にカンマや改行が含まれていたり、引用符で囲まれていたりする場合には期待通りに動かないことがあるので、仕様をよく確認する必要があります。

StreamReaderを使って1行ずつ処理する方法

File.ReadAllLinesとは異なり、StreamReaderを使うとファイル全体を一度に読み込まず、1行ずつ処理します。これによりメモリ負荷が抑えられ、大きなCSVでも比較的安全に扱えます。文字コード指定も可能で、日本語環境ではShift_JISやUTF-8などを指定できます。

具体的にはusingを用いてStreamReaderをインスタンス化し、whileループでEndOfStreamまでReadLineを呼び、それからSplitや他の処理を行います。エラー処理や例外処理もこの方法で組みやすいのが特徴です。

TextFieldParserクラスで高度なCSV仕様に対応

TextFieldParserクラスは、値にカンマが含まれる、引用符で囲まれている、ホワイトスペースの取り扱いなど、CSV仕様の複雑な要件にも対応できるクラスです。標準のSplitだけでは扱えないケースを簡潔に処理できるため、品質や保守性が求められるプロジェクトではこちらの利用が推奨されます。

設定可能なプロパティとして、Delimitersで区切り文字、HasFieldsEnclosedInQuotesで引用符付きデータの処理を行うかどうか、TrimWhiteSpaceで前後の空白をどう扱うかなどがあります。複雑なCSVファイルではこのような設定が役立ちます。

ライブラリを利用したCSV 読み込みの進め方

標準機能だけでなく、より信頼性や機能性を高めるためにCSV専用ライブラリの利用が非常に有効です。最新情報では外部ライブラリを利用することで、型変換、文化(カルチャー)対応、非同期読み込み、大量データのストリーミング処理などが手軽に実現できます。以下に主要なライブラリやその特徴を紹介します。

CsvHelperの使い方と特徴

CsvHelperは人気のあるオープンソースのライブラリで、C#でCSVの読み書きを簡単に行えるよう設計されています。カラムをオブジェクトにマッピングしたり、区切り文字や引用符・書式を柔軟に設定できます。NuGetでインストール可能で、文化設定(CultureInfo)などで国内外のフォーマットにも対応できる点が魅力です。

サンプルコードでは、StreamReaderと組み合わせてCsvReaderを使い、GetRecordsで指定のクラスに直接マッピングすることで、読み込んだCSVをそのままオブジェクトとして扱えます。複雑なCSVや型の取り扱いを意識するなら、このライブラリが第一選択になることが多いです。

IronXLで読み込み+Excel互換操作

IronXLはCSVだけでなくExcel形式との互換性を持つライブラリで、CSVファイルを読み込んだ後にExcelワークブックとして扱う機能があります。LoadCSVメソッドで取り込み、その後セル操作やシート操作も可能なので、CSVをただ読み込むだけでなく、Excel的に加工・表示する用途に適しています。

ただしライセンス条件や商用利用時の制約があることがあるので、プロジェクト条件に応じて確認が必要です。また依存関係が多少重くなる可能性もあります。

その他の軽量ライブラリとストリーミング対応の選択肢

大量のデータを扱う場合や、メモリを節約しながら処理を行いたい場合は、軽量でストリーミング処理に対応したライブラリが便利です。例えば、大小さまざまな例外ケースに対応した読み込み機能を持つ物、非同期読み込みをサポートするものなどがあります。

こうしたライブラリでは、例として自作やコミュニティ運用の物も含め、デリミタや引用符、改行内文字、メモリ配分、速度のチューニングといった部分で差が出ます。用途に応じて選ぶことが重要です。

具体的なコード例と実践パターン

ここからは、「C# CSV ファイル 読み込み」を実際に実装する際に役立つコード例と典型的なパターンを紹介します。初心者でも試せるものから、現場で使われる応用例まで取り上げますので、自分の用途に近いものを参考にして下さい。

簡単なサンプル:1行ずつ読み込み+Split処理

まずは基本のサンプルです。以下のパターンは、小さなCSVを扱うツールやテスト向けに最適です。ファイルを読み込んで名前と価格といった内容を処理する想定です。

using var reader = new System.IO.StreamReader("data.csv", System.Text.Encoding.UTF8);
while (!reader.EndOfStream)
{
  var line = reader.ReadLine();
  var columns = line.Split(',');
  var name = columns[0];
  var price = columns[1];
  Console.WriteLine($"{name} : {price}");
}

この処理ではUTF-8を使っていますが、日本語Windows環境などではShift_JISやUTF-8 with BOMなどの違いで文字化けが発生する可能性があります。文字コードの指定は必ず行うべきです。

引用符付き値対応:TextFieldParserを使う例

次のコードは、値にカンマが含まれるケースや引用符で囲われた文字列、空白扱いなどに対応する実装です。TextFieldParserクラスを使うことで、こうした仕様を標準的に処理できます。

using Microsoft.VisualBasic.FileIO;
using var parser = new TextFieldParser("data.csv", System.Text.Encoding.UTF8);
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = true;
parser.TrimWhiteSpace = false;
while (!parser.EndOfData)
{
  string[] fields = parser.ReadFields();
  foreach (var f in fields)
    Console.WriteLine(f);
}

この方法なら、”値に区切り文字が入っている”、”空白が先頭尾についている”、”改行を含むフィールド”など多くのCSVの実用的要件に対応可能です。厳密なCSV仕様を扱うならこのアプローチが安全です。

オブジェクトマッピングとCsvHelper使用例

大規模プロジェクトや複数種類のデータを扱うときは、CSVの各列をクラスプロパティに対応付けて読み込む方が保守性に優れます。ここではCsvHelperでカスタム設定を使いながらマッピングする例を紹介します。

public class Person { public string FirstName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } }

using var reader = new System.IO.StreamReader("people.csv", System.Text.Encoding.UTF8);
using var csv = new CsvHelper.CsvReader(reader, System.Globalization.CultureInfo.InvariantCulture);
csv.Configuration.HasHeaderRecord = true;
var people = csv.GetRecords<Person>();
foreach (var p in people)
{
  Console.WriteLine($"{p.FirstName} {p.LastName} born on {p.BirthDate:d}");
}

日付や数値の変換に失敗する可能性があるときや、カラム数が変則的なCSVに対しては、null対応プロパティやTryParse系の処理を入れておくと堅牢なコードになります。

注意点・トラブルシューティング

C#でCSV読み込みを行う際に陥りやすい問題とその対策を整理します。データ形式や環境差、ライブラリの制約などを理解し、コードを書くときに未然に対処しておくことで、後のバグや運用コストを減らせます。

文字コードの問題と文字化け対策

CSVファイルがUTF-8ではなく、Shift_JISやEUC-JPなどで保存されている場合、文字化けが発生することがあります。StreamReader等で読み込む際にはEncodingを明示することが重要です。また、ファイルにBOM(Byte Order Mark)があるかないかで挙動が変わることもあるため、編集保存時の設定を確認しておくべきです。

値中にカンマや改行が含まれているケース

値そのものにカンマや改行が含まれているCSVは、シンプルなSplit方式では正しく処理できません。引用符で囲む仕様があるCSVを扱う場合は、TextFieldParserやCsvHelperのようなライブラリを使い、HasFieldsEnclosedInQuotes等の設定を有効にすることが必要です。

ヘッダー行の有無と列数の不一致

CSVの1行目がヘッダーとして列名であるケースが多くあります。これを認識してSkipしたり、カラム名でアクセスできるように設定することが望ましいです。また、行ごとに列数が異なるデータが混在していると、配列のインデックス外例外が発生するので、columns.Lengthをチェックするなどの防御コードを書くことが必要です。

大量データのパフォーマンスとメモリ消費

ファイル全体を読み込む方式は簡単ですが、大容量ファイルではメモリ不足や処理速度の遅延を招きます。StreamReaderを使った1行ずつ処理や、CSVライブラリのストリーミング機能を利用すると改善します。また非同期読み込みを取り入れることでUIの応答性を保ちやすくなります。

C# CSV ファイル 読み込みの比較表

主要な方法やライブラリを比較し、用途に応じてどれを選ぶべきか判断できるように表に整理します。

方法/ライブラリ 利点 向いている用途 注意点・制限
File.ReadAllLines+Split方式 実装が非常に簡単。依存ライブラリなし。 小規模データ、一時的なスクリプトや学習用途。 値中のカンマ・改行・引用符に非対応。メモリ消費が大きい。
StreamReader 一行処理方式 メモリ効率が良い。文字コード指定できる。柔軟性あり。 中規模データ、コンソールツールやデスクトップアプリ。 細かいCSV仕様への対応はコードに依存。例外処理が必要。
TextFieldParser クラス 引用符付き値・区切り文字オプション・改行含むフィールド対応。 複雑なCSV、運用での信頼性が求められるシステム。 Microsoft.VisualBasicアセンブリの参照が必要。パフォーマンスが多少落ちることも。
CsvHelper ライブラリ 強力なマッピング機能、カスタマイズ性、型安全、最新のCSV仕様対応。 業務データ処理、大量レコード、API連携。 初期設定が多少必要。依存パッケージが増える。ライセンス確認必須。
IronXL や類似フレームワーク Excelライクな操作が可能。ワークブック機能も使える。 CSVの後Excelで編集・共有する用途、大画面アプリ。 重め。商用ライセンスの判断が必要。ファイルI/Oのオーバーヘッドがある。

実務で役立つ最新テクニックとベストプラクティス

最新情報に基づくテクニックを押さえておくことで、保守性・パフォーマンス・読みやすさが大きく向上します。2025年〜現在にかけて広く使われている手法を中心に紹介します。

非同期読み込みでUIの応答性を保つ

GUIアプリケーションやWebアプリケーションでは、CSV読み込み中の処理がUIをブロックしてしまうと使い勝手が悪くなります。StreamReaderのReadLineAsyncや、CsvHelperの非同期APIを使うことでUIスレッドを圧迫せずに処理できます。大量データでは顕著な差が出ます。

カルチャー設定と区切り文字のローカライズ

CSVで数値や日付を扱うとき、日本式の小数点や日付形式、区切り文字(カンマ以外)などが関係してきます。CultureInfoをInvariantや特定カルチャーに設定したり、CsvConfigurationでDelimiterを「;」などに変えることで誤解やエラーを減らせます。地域性のあるデータを扱う場合はこの設定を最初に見直すことが重要です。

例外処理とデータ検証の仕組みを入れる

CSVファイルは外部から来ることが多いため、予期しない値や欠損値などの可能性があります。列数のばらつき、型変換失敗、空白・NULL値の混在などに備えて、TryParseやnull許容型、Lengthチェックのコードを入れるとトラブルを防げます。ログ出力やユーザへの通知も考慮すべきです。

ストリーミングとチャンク処理で大容量データに対応

数百万行を越えるCSVの場合、全体をメモリに載せると性能問題になります。そのためストリーミング処理、Chunk単位で読み込むパターン、遅延評価(yield return)などを活用するのが最近のおすすめです。CsvHelperにはそのような使い方も含まれており、最新のCSV処理ではこのスタイルが主流となっています。

比較的複雑なユースケースとその対応策

CSV読み込みには標準的でない複雑なパターンも多くあります。ここではそのようなパターンと具体的な対応策を解説します。これらを知っておくとプロジェクトでの「それ想定してなかった」を防げます。

複数区切り文字(カンマ・セミコロンなど)が混在する場合

CSVファイルの区切り文字が常に一定とは限りません。カンマとセミコロンが混在、または異なる環境から来たCSVファイルが混在して扱われることがあります。CsvHelper等ではDelimiterを動的に設定でき、HasHeaderRecordをオフにすることで柔軟に対応できます。事前にファイル内容をサンプルで確認して設定するのが一般的な方法です。

改行を含むフィールドや引用符の二重解釈

CSV仕様では、値の中に改行が含まれるケースや、値を囲う引用符の中に更に引用符を含めることがあります。Split方式では処理できず、TextFieldParserかCsvHelperの「フィールド囲い設定」と「引用符内の引用符の扱い」の設定を必ず用いる必要があります。これにより項目の切れ目がずれるなどの致命的な誤りを防げます。

空行や不完全な行の扱い

CSVファイルの中には空行や列数が足りない行、あるいは追加の区切り文字だけの行が混じっていることがあります。TrimEmptyLinesの設定や、読み込み後に配列長をチェックするコードを用いることで例外発生を抑制できます。また、許可範囲を設定して「この程度不足なら無視する」「ログだけ残す」といったポリシーを明確にしておくと運用上安心です。

メモリ内表現とキャッシュ戦略

一度読み込んだCSVデータを繰り返し使う場合、List<T>や配列への格納が便利です。しかしデータ量が大きいとキャッシュとして保持するのは重くなることがあります。必要な列だけを抽出する、部分読み込みする、またはDB等へインポートして扱うなど、システム構成を設計する段階で戦略を選びます。

まとめ

C#でCSVファイルを読み込むには、「CSVファイル読込みの基本方法」を押さえた上で、目的や対象のCSVの仕様に応じて方法を選ぶことが鍵です。単純なデータならFile.ReadAllLines+Splitで十分ですが、値に区切り文字が含まれる、高度な仕様がある、大量データを扱う、GUIアプリケーションなど特定の条件がある場合にはTextFieldParserやCsvHelper、IronXLといったライブラリの利用が実務では安心です。

文字コード、ヘッダー行、引用符、改行を含むフィールドなど、細かい仕様を把握し、それに対応できるコードを書くことでトラブルを未然に防止できます。最新のライブラリやテクニックを活用すれば、保守性・効率・信頼性が大幅に向上します。まずは小さなコードで試して、自分の用途に合う方法を決めていって下さい。

関連記事

特集記事

コメント

この記事へのトラックバックはありません。

TOP