.NET CoreでTextFieldParserを使用したCSVの読み取り

.NET Coreに"TextFieldParser"ないじゃん!作ろう!(当然Unityにも無いです。

、、、とはいっても.NET Core3.0で移植されるみたいなのでそれまでのつなぎって感じですかね、、、?

C#でCSVの読み取りを検索するとよく出てくる「TextFieldParser」(名前空間:Microsoft.VisualBasic.FileIO)ですが、.NET Fraemework環境でのみ使用可能で.NET Core環境には存在しないみたいです。VB系の処理なのでまぁ、、、移植される可能背もなさそうです。

というわけでMonoをベースにC#に移植してみました。

開発・確認環境

ReferenceSource にコードの記載がない(.NET 4.8は宣言しか記載なし)だったのでmonoを参考にしました。

(参照にしていますがこのコードも程よく思った通りに動かない気がしないでもないです、、、

成果物

以下のGitに配置しました。そのままプロジェクトにコピペして使用ください。

github.com

使い方

まずこんなCSVを用意します。

// Sample.csv
1,2,3,4,5
"a,a",2,3,4,"5"
"a,a", 2, 3,"4", 5

そして以下の要領で読み込みを行います(使い方は完全に既存の解説と同じです)

using System;
using System.Text;
using Microsoft.VisualBasic.FileIO;

internal static void Main(string[] args)
{
    Console.WriteLine("Hello World!");

    using (var parser = new TextFieldParser(new StreamReader(@"D:\Sample.csv")))
    {
        // カンマ区切りの指定
        parser.SetDelimiters(",");
        // フィールドが引用符で囲まれているか
        parser.HasFieldsEnclosedInQuotes = true;
        // フィールドの空白トリム設定
        parser.TrimWhiteSpace = true;

        while (!parser.EndOfData) // ここで内部的に次の行を読みます。
        {
            string[] items = parser.ReadFields();
            Array.ForEach(items, p => Console.Write($"[{p}] "));
            Console.WriteLine();
        }
    }
}

// 出力結果
// [1] [2] [3] [4] [5]
// [a,a] [2] [3] [4] [5]
// [a,a] [2] [3] ["4"] [5]

簡単ですが以上です。