Unityメモ – CSVファイルを読み込む方法

Posted: 2016年3月28日 カテゴリー: プログラミングメモ, Unity, Unity メモ
タグ:, ,

今回はUnityでCSVファイルを読み込む方法を紹介します。

CSVファイルは中身がスプレッドシート(エクセルとか)みたいなデータが文字として入っています。各セルに当たる箇所は”,”と段によって区切られています。

例を上げるとエクセルではこう表示されるファイルがあるとして:

excel0
それの中身がこうなっています:
15,15,1,15,15,15,

15,15,6_u0,15,15,15,

15,15,6,15,15,15,

4_s,5,13_v0_u0,5,5,2_g,

ですので、読み込み方としましては、Resource.Load()でテキストデータとして読み込んでから、StringReaderに渡して、セル毎にデータを分けてListに保存します。

 

ではさっそく実装に入ります。まずクラス宣言です。

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

/// <summary>
/// CSVファイルを読み込み、データを保持するクラス
/// </summary>
public class CSVReader
{
    /// <summary>
    /// CSVファイルの拡張子
    /// </summary>
    public const string _EXTENSION = ".csv";

    /// <summary>
    /// セルを区切る為にキャラ
    /// </summary>
    public const char _SPLIT_CHAR = ',';

    /// <summary>
    /// 行がコメントだと言う事を表す文字列
    /// </summary>
    string m_commentString = "//";

    // 読み込んだデータ
    List<List<string>> m_data = new List<List<string>>();
    TextAsset m_textAsset = null;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="comment">コメントの文字列</param>
    /// <param name="isReadFromDisc">Resourcesでなくディスク(フルパス)から読み込むか</param>
    public CSVReader(string comment = "//")
    {
        m_textAsset = null;
        m_data = new List<List<string>>(10);
        m_commentString = comment;
    }

区切りで使用する”,”も宣言しておきます。List<>の中にList<string>を宣言する事で、入れ子的にして2次元配列の変わりにしています。別に2次元配列を作っても大丈夫です。

次に読み込み処理です。まず、テキストファイルをResourcesから読み込んで、TextReaderを返す処理を作ります。

    private TextReader CreateTextReader(string fileName)
    {
        m_textAsset = Resources.Load<TextAsset>(fileName);
        return new StringReader(m_textAsset.text);
    }

それでは実際の読み込み処理です。やる事としましては、上記の処理を呼んでデータを読み込んだ後に、1行ずつ拾っていき、それを各セル毎に区切って保存します。

    public bool Load(string fileName) 
    {            
        m_data.Clear();
        TextReader reader = CreateTextReader(fileName);

        int counter = 0;
        string line = "";
        while ( ( line = reader.ReadLine()) != null ) 
        {
            // コメントが入っている時はスキップする
            if ( line.Contains( m_commentString ) )
            {
                continue;
            }
            
            // 今の列をマス毎に区切る
            string[] fields = line.Split( _SPLIT_CHAR );
            m_data.Add( new List<string>() );

            foreach ( var field in fields )
            {
                if (field.Contains(m_commentString) || field == "")
                {
                    continue;    
                }
                m_data[ counter ].Add( field );
            }
            counter++;
        }

読み込みが終わりましたので、リソース開放をしておきます。

        // 読み込んだリソースを開放する
        Resources.UnloadAsset(m_textAsset);
        m_textAsset = null;
        Resources.UnloadUnusedAssets();
        return true;
    }

これでデータは準備出来ましたので、後はデータを獲得する処理を宣言していきます。

データは全部文字列として保存しておりますが、CSVの中で数値等を扱う事が有りますので、様々な取り出し方を作っておきます。

    public string GetString(int row, int col)
    {
        return m_data[ row ][ col ];    
    }

    public bool GetBool(int row, int col)
    {
        string data = GetString(row, col);
        return bool.Parse( data );
    }

    public int GetInt(int row, int col)
    {
        string data = GetString( row, col );
        return int.Parse( data );
    }
        
    public float GetFloat(int row, int col)
    {
        string data = GetString( row, col );
        return float.Parse( data );
    }

後は実際にCSVReaderのインスタンスを作ってデータを使うだけです。

        string path = "WordTable"; //今回はResources直下の想定
        CSVReader reader = new CSVReader();
        reader.Load(path);

        // 取り出し例
        reader.GetString(0, 2);

以上になります。

 

微妙に中身が違いますが、今回のソースです:

– https://github.com/ookumaneko/Blog_Unity/blob/master/CSVReader.cs

 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中