CSV守護神

【C# .NET8対応】改行・カンマを含むCSVを正しく読み込む2つの方法(TextFieldParser / CsvHelper)

2025年7月30日

CSVファイルをC#で読み込むとき、「カンマ」「改行」「ダブルクオート」などに苦しんだ経験はありませんか?

この記事では、特に.NET 8 環境で改行やカンマを含む複雑なCSVを正しく読み込む2つの方法を紹介します。

どちらもLINQと組み合わせて使えるので、後処理や検索もスマートに行えます。


✅ よくあるCSVの問題

例えば、次のようなCSVファイルを処理する場合:

NUM,SECTION,NAME,VALUE
1,"営業",山田,"売上1000"
2,"営業,
開発",田中,"売上500, 開発300"
3,"デザイン,開発",鈴木,"デザイン200, 開発400"
    

この中には…

があり、単純な string.Split(',') では正しく処理できません。


方法①:TextFieldParser を使う(.NET 標準)

TextFieldParser は、Microsoft.VisualBasic 名前空間に含まれるクラスで、カンマ区切り + ダブルクオート対応 + 改行対応 が可能。

✔ サンプルコード

using Microsoft.VisualBasic.FileIO; // NuGet: Microsoft.VisualBasic

class CsvRecord
{
    public int NUM { get; set; }
    public string SECTION { get; set; }
    public string NAME { get; set; }
    public string VALUE { get; set; }
}

var records = new List<CsvRecord>();

using var parser = new TextFieldParser("sample.csv");
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
parser.HasFieldsEnclosedInQuotes = true;

// ヘッダーをスキップ
parser.ReadLine();

while (!parser.EndOfData)
{
    var fields = parser.ReadFields();
    if (fields.Length >= 5)
    {
        records.Add(new CsvRecord
        {
            NUM = int.Parse(fields[0]),
            SECTION = fields[1],
            NAME = fields[2],
            VALUE = fields[3]
        });
    }
}
    

✔ 特徴

項目内容
改行対応✅ 完全対応
外部ライブラリ❌ 不要(標準)
LINQ対応✅ 利用可能
弱点名前空間がVB依存、ややレガシーな印象

方法②:CsvHelper ライブラリを使う(推奨)

CsvHelper は、.NETで最も人気のあるCSV読み書きライブラリで、改行・カンマ・クォートなどすべてに対応済み。

✔ インストール

dotnet add package CsvHelper
    

✔ サンプルコード(自動マッピング)

using CsvHelper;
using System.Globalization;

class CsvRecord
{
    public int NUM { get; set; }
    public string SECTION { get; set; }
    public string NAME { get; set; }
    public string VALUE { get; set; }
}

using var reader = new StreamReader("sample.csv");
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
var records = csv.GetRecords<CsvRecord>().ToList();

foreach (var rec in records)
{
    Console.WriteLine($"{rec.NUM}: {rec.NAME} => {rec.VALUE}");
}
    

✔ エラー対策:「No members are mapped for type」の対処法

プロパティ名とCSVヘッダー名が一致していないと、以下のようなエラーが出ます:

No members are mapped for type 'CsvRecord'
    

▶ 解決方法1:プロパティ名をヘッダーと一致させる

▶ 解決方法2:[Name("ヘッダー名")] 属性を付ける


どちらを選ぶべきか?

特徴TextFieldParserCsvHelper
改行・カンマ対応
導入の手軽さ◎(標準)○(NuGet)
拡張性・機能
学習コスト

まとめ

C#でCSVを読み込む際に、改行やカンマを含むフィールドを安全に処理するにはTextFieldParserCsvHelper を使うのがベストなのかもしれません

.NET 8 や LINQ と組み合わせれば、スマートで強力なCSV処理が可能になります。


WinUI 3 / XAML の Grid.Width 設定方法

WinUI 3でMenuFlyoutをShowAtで表示する方法【コード付き解説】

MenuFlyoutWinUI 3 で便利なポップアップメニュー

WinUI 3の開発で混乱しがちな「空白のウィンドウ」と「空白のページ」の違い

PowerShellでMSIXアプリ(Storeアプリ)を起動する方法|AppUserModelIdとURIスキーム活用術

Microsoft Storeアプリ更新時のロールアウト設定まとめ

PowerShellでtail -f!WindowsでUTF-8対応のリアルタイムログ監視を実現する方法

Microsoft純正の新しいコンソールエディタ「edit」が復活!| edit.exe インストール方法

Microsoft Authenticatorのオートフィル機能が2025年7月に終了

RuntimeBroker.exeとMsEdgeWebView2.exeとは?Windows 11のプロセスについて

PowerShellでGrapheme Clusterについて処理を考える

業務用ノートパソコンのストレージは暗号化されている?BitLockerの確認と対策方法

【Windows】Volta コマンドライン インストール | Node.jsをバージョン管理する方法

【C# .NET 8 対応】List<string> を重複なしでマージする方法|

【C#】大容量ファイルを指定サイズ以下に分割する方法|.NET8対応コード付き

【C# .NET 8】ファイルから重複行を削除する2つの方法|Distinct vs HashSet

【C#】.emlファイルの本文を読みやすく抽出する方法

WinUI 3 ComboBoxの自作クラスバインドと選択イベント検出方法

switch文でオブジェクトの型を判別する方法

【WPF】Task.Run中にUIを更新する方法

System.Text.Json 9.0.0.0 で FileNotFoundException

C#で改行・カンマ入りのCSVを正しく読み込む方法【.NET8対応】

C#/.NET 8でDateTimeを日本時間でISO 8601形式に変換する方法

【Anker Soundcore Liberty 4】イヤーピース紛失!代替品はAmazonで購入

和暦設定でも安心!C#でISO 8601やカスタム日時文字列を確実にDateTimeに変換