はかせのラボ

私の頭の中を書いていく雑記ブログです

Unity 簡単CSV読み書き

あいさつ

どうも、はかせです。
Unityでも使えるCSVの読み書きの仕方です。

なぜCSVなのか?

・作るのが簡単
Excelスプレッドシートで管理できる
・所詮テキストファイルのため色んなシステムとの親和性がある

理由はこんな感じですね。

特に二つ目と三つ目の恩恵が大きくて
楽に管理出来るうえ、データをCSVで出力するプログラムって意外とあって
そのデータも同じ機構で読み書きできるので意外と使えたりします。

実装

using部分

using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;

データクラスに実装するインターフェース

public interface ICSVParse
{
    void CSVParse(string[]data);
    string CSVSave();
}

データクラスでは
・読み込んだCSVの文字列データを受け取り自身のクラスに当てはめる
・自身のデータをCSVで保存する文字列に変換する

この二つのメソッドとそれぞれ独自の変数を持ちます。

実際に読み書きする部分

public static class CSVParser 
{
    //使うResourcesファイルのパス
    private static string mResourcesPass = "Assets/Resources/SaveData/";

    //TextAssetを使うパターン
    public static IEnumerable<T> CSVLoad<T>(TextAsset inText) where T :ICSVParse , new()
    {
        return Load<T>(text.text);
    }
    //ファイル名を指定して使うパターン
    public static IEnumerable<T> CSVLoad<T>(string inLoadDataFile) where T : ICSVParse, new()
    {
        var dataText = new StreamReader(mResourcesPass + inLoadDataFile);
        return Load<T>(dataText.ReadToEnd());
    }
    //実際にCSVファイルを読み込む部分
    private static IEnumerable<T> Load<T>(string inText) where T : ICSVParse, new()
    {
        var csvDatas = new List<string[]>();
        var reader = new StringReader(inText);
        var result = new List<T>();
        while (reader.Peek() > -1)
        {
            csvDatas.Add(reader.ReadLine().Split(','));
        }
        foreach (var strs in csvDatas)
        {
            try
            {
                T data = new T();
                data.CSVParse(strs);
                result.Add(data);
            }
            catch
            {
                continue;
            }
        }
        return result.AsEnumerable<T>();
    }
    //CSVファイルで書きだす
    public static void CSVSave<T>(IEnumerable<T> inSaveDatas,string inSaveDataPass = "SaveData.csv") where T : ICSVParse
    {
        try
        {
            using (var sw = new System.IO.StreamWriter(mResourcesPass + inSaveDataPass, false))
            {
                foreach(var data in inSaveDatas)
                {
                    sw.WriteLine(data.CSVSave());
                }
            }
        }
        catch (System.Exception e){}
    }
}

CSVの読み書きはI/OStreamを使って行います。
CSVはカンマ区切りのテキストファイルでしかないので
読み書きの実装は単純で済みます。

読み込むときは
一行ごとに読み込んでそのデータを
渡されたクラスのパースメソッドに食わせています。

書き込むときには
データの配列をもらい各データの
クラスのセーブメソッドを呼び出し保存する文字列を取得して書き込みます。

あとがき

今回はUnityC#でのCSV読み書きでした。
世の中には無料有料含めて色んなパーサーが出回っているので
わざわざこんなものを自作する機会ってのは減ってるかもしれません。

ただ自作なのでいくらでも改造できますし、
ビルドしたりめんどくさい設定とか抜きで使えるので
私は自分好みのツールとかを自作することが多いです。
(あと単純にツール作るの楽しい)

それでは今回はこの辺でノシ