vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

C#で CSV -> Json を作る

はじめに

前回PythonでCSVからJsonを作るというのをやりましたが、
ふとC#(Unityではなく)でやってみたらどうなるんだろう、と思ったのでやってみました。

CSVを読み込む

CsvReader.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace CsvConverter
{
    public class CsvReader
    {
        public List ReadCsv()
        {
            using (var reader = new StreamReader(@"parts.csv", Encoding.UTF8))
            {
                var partsList = new List();
                // 1行目はスキップ.
                reader.ReadLine();
                    
                while (reader.Peek() > -1)
                {
                    var readText = reader.ReadLine();
                    if (readText == null)
                    {
                        continue;
                    }
                    var splitTexts = readText.Split(',');
                    if (splitTexts.Length < 3)
                    {
                        continue;
                    }
                    var newParts = new Parts
                    {
                        PartsNo = splitTexts[0],
                        PartsName = splitTexts[1],
                        Description = splitTexts[2],
                    };
                    partsList.Add(newParts);
                }
                return partsList;
            }
            return null;
        }
    }
}

Jsonファイルとして出力

Parts クラスのリストを Json に変換するには、UniRxでいつもお世話になっている neueccさんの DynamicJson を使用しました。

http://dynamicjson.codeplex.com/

シンプルな使い勝手ながら、しっかりとドキュメントも用意されていて大変ありがたい限りですm(__)m

唯一はまったのが、変換元のクラスの変数は、プロパティを持つ必要がある、ということです。

MetaParts.cs (失敗)

public class MetaParts
{
    public string ModelName;
    public List PartsList;
}
  • この場合、正しく変換できず空の Json ができてしまいます。

正しくは。。。

MetaParts.cs

public class MetaParts
{
    public string ModelName { get; set; }
    public List PartsList { get; set; }
}

変換自体は驚くほどに簡単です。

JsonCreator.cs

using System;
using System.IO;
using System.Text;
using Codeplex.Data;

namespace CsvConverter
{
    public class JsonCreator
    {
        public string Create(MetaParts parts)
        {
            // MetaPartsクラスのオブジェクトをJsonに変換して返す.
            return DynamicJson.Serialize(parts);
        }
        public void Output(string jsonText)
        {
            using (var writer = new StreamWriter(@"parts.json", false, Encoding.UTF8))
            {
                // Jsonファイルとして出力.
                writer.Write(jsonText);
            }
        }
    }
}

メインクラス

最後に、各クラスを呼び出すメインクラスです。

Program.cs

using System;
using System.Collections.Generic;

namespace CsvConverter
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            var reader = new CsvReader();
            var partsList = reader.ReadCsv();

            if (partsList == null)
            {
                return;
            }
            
            var creator = new JsonCreator();
            var sampleMetaParts = new MetaParts
            {
                ModelName = "Model1",
                PartsList = partsList
            };
            var jsonText = creator.Create(sampleMetaParts);
            creator.Output(jsonText);
        }
    }
}