yoraba build

備忘録を兼ねた技術ブログ

C#のCSVパーサを作成

今まではVisual Studioでの開発を行っていたのですが、
Linux環境ではVisual Studio Codeがエディタとして提供されているので、
試しに使ってみました。
使用感は悪くありません。そしてとても軽量です!

CSVパーサ

ちょっとしたツールを作りたい時にCSVファイルは便利です。
データベースよりも気軽に表データを扱うことが出来るからです。
可変列長の表データを作りたい場合、クラスを使うことには難があります。
静的型付けプロパティが列挙されたようなクラスに柔軟性はありません。
かといってプロパティを動的取得するのもパフォーマンス的にあまりよくないです。
マトリックスデータを扱う型の選択肢の一つとして、
私は辞書型リストを用いることを考えました。

パーサインターフェース

今後、CSV以外にもJSONXMLなどのパーサを作成することを想定して、
インターフェースを作成しました。
拡張関数でファイル入出力が行えるようにしてあります。
https://github.com/yoraba/csharp-tools/blob/master/mylib/Parser/IParser.cs

利用例

     public class TestParser
    {
        const string DAT_PATH = "./dat";
        List<Dictionary<String, Object>> _dict_list = new List<Dictionary<string, object>>{
            new Dictionary<string, object>{{"string_data", "1"},{ "int_data", 2 } ,{ "float_data", 3.3 } },
            new Dictionary<string, object>{{"string_data", "4"},{ "int_data", 5 } ,{ "float_data", 6.6 } },
            new Dictionary<string, object>{{"string_data", "7"},{ "int_data", 8 } ,{ "float_data", 9.9 } }
        };

        [Fact]
        public void TestDict2CSV()
        {
            var parser = new CSVParser();
            var path = System.IO.Path.Combine(DAT_PATH, "d2c.csv");
            Assert.True(parser.ToFile(path, parser.Dict2Str(_dict_list)));
            Assert.True(System.IO.File.Exists(path));
        }

        [Fact]
        public void TestCSV2Dict()
        {
            var parser = new CSVParser();
            var path = System.IO.Path.Combine(DAT_PATH, "c2d.csv");
            var answer = parser.Str2Dict(parser.FromFile(path));
            Assert.True(answer != null);
            foreach (var row in answer)
            {
                foreach (var col in row)
                {
                    Console.Write($"{col.Key}:{col.Value} ");
                }
                Console.WriteLine();
            }
        }
    }