その他

[C#] CSVの読み込み・書き込みを行う方法

今回は、C#でCSVの読み込み、書き込みを行う方法についてご紹介します。

CSVファイルはデータのやり取りや保存などで広く利用されています。

C#には標準ライブラリや外部ライブラリを使ってCSVファイルを扱う方法が複数あり、用途やファイルの内容に応じて最適な手法を選択できます。

ここでは、代表的な方法として標準ライブラリCsvHelperなどの専用ライブラリを使った実装例を中心に、注意点も含めてご紹介します。

StreamReader・StreamWriterを用いた方法

まずは標準ライブラリを使ったシンプルな読み書き方法です。

ファイル操作に慣れていない場合でも、StreamReaderやStreamWriterは使いやすいので、多くの環境で活用されています。

CSVを読み込む例

以下のコードでは、StreamReaderを用いてCSVファイルを1行ずつ読み込み、カンマで分割したデータを出力します。

実行結果

Name | Age | Country
Alice | 30 | USA
Bob | 25 | UK

このコードはカンマ区切りを想定しているため、フィールド内にカンマや改行が含まれる場合には正しく分割できない可能性があります。

こうしたシンプルなCSV以外を扱う場合は、後述する専用ライブラリを検討するとよいでしょう。

CSVに書き込む例

次に、StreamWriterを用いてCSVファイルに書き込む例です。

このサンプルでは、文字列の二次元配列をループ処理し、各行をカンマ区切りの文字列に連結して書き出しています。

実行結果

CSVファイルへの書き込みが完了しました。

このように、標準ライブラリのStreamReaderやStreamWriterを使うだけで、単純なCSV処理は十分に実装できます。

ただし、フィールド内に特殊文字(カンマや改行、引用符など)が含まれる場合は、専用ライブラリを使わないと正しく扱えない場合があります。

CsvHelperなどの専用ライブラリを活用する方法

CSVの規格は単純にカンマ区切りとは限らず、複雑な仕様に対応する必要があるケースも多く存在します。

CsvHelperは、フィールド内にカンマや改行が含まれる状況でも正しくパースできるなど、高機能で便利なライブラリです。

NuGetからインストールして利用するため、プロジェクトの依存関係やライセンスにも注意してください。

CsvHelperを用いた読み込み例

CsvHelperでは、データをマッピングするクラスを定義しておき、CSVからそのクラスのリストを読み込むことができます。

実行結果

Alice – 30 – USA
Bob – 25 – UK

このように、CsvHelperではヘッダとクラスのプロパティを自動的にマッピングして読み込めるため、コードの可読性が向上します。

CsvHelperを用いた書き込み例

CsvHelperは読み込みだけでなく、オブジェクトのリストをCSVファイルに書き出すことも可能です。

実行結果

CSVファイルへの書き込みが完了しました。

特殊文字や改行などの扱いもCsvHelperが自動的に処理してくれるため、複雑なCSVを扱う場合に非常に便利です。

その他の方法と注意点

上記以外にも、File.ReadAllLinesでCSVを一括読み込みし、LINQで操作する方法があります。

また、Microsoft.VisualBasic.FileIO.TextFieldParserを使うと、引用符を含むCSVにも対応できます。

ただし、これらを使用する場合でも以下の点を意識すると、CSV処理をより安定させられます。

  • 文字エンコーディング:UTF-8以外のファイルなら適切に指定する
  • 例外処理:ファイルが存在しない場合やフォーマットエラーに備えてtry-catchを活用
  • 大規模ファイルへの配慮:巨大なCSVは一括読み込みがメモリを圧迫する可能性がある
  • ライブラリの依存関係:外部ライブラリはプロジェクトの依存性やライセンスにも注意

これらの方法を踏まえて、扱うCSVファイルの規模や内容に合ったアプローチを選択すると効率的に実装できます。

まとめ

C#でCSVを扱う際は、シンプルな形式か複雑な形式かを判断し、適切な手法を選びましょう。

標準ライブラリのStreamReader・StreamWriterは学習コストが低く、CsvHelperは複雑なCSVにも柔軟に対応可能です。

エンコードや例外処理など、ファイル操作の基本的な注意点も忘れずに実装することをおすすめします。