logo

【Unity】Json,CSVファイルを相互に変換する方法【備忘録】

投稿日2023-10-11

更新日2024-05-03

Picture of the logo

タグ一覧

目次(タップして移動)

この記事について

個人的備忘録も兼ねてUnityでインスペクタ上でテキストファイルを指定して、そのファイルから結果を取得する方法をいくつか紹介します。

  • インスペクタで指定したテキストファイルを読み込み、その中身をstring型として取得する
  • インスペクタで指定したテキストファイルを読み込み、CSV形式をJson形式に変換しstring型として取得する
  • インスペクタで指定したテキストファイルを読み込み、Json形式をCSV形式に変換しstring型として取得する

サンプルコードの紹介

下記のコードを空のオブジェクトにアタッチして、そのインスペクタにファイルをドラッグアンドドロップする事で使用する事が出来ます。

インスペクタで指定したテキストファイルを読み込み、その中身をstring型として取得する

UnityエディターのInspectorウィンドウでファイルをドラッグアンドドロップで選択できるようにするには、Serializableなフィールドを使って、ファイルのパスやリソース参照を保存するスクリプトを作成する必要があります。以下は、この目的のためのスクリプトの基本的な例です。

using UnityEngine;

public class ReadTextFromInspector : MonoBehaviour, IReadTextFromInspector
{
    public TextAsset textFile; // textファイルを格納するためのフィールド
    private string text;
    public string ReadText()
    {
        return text;
    }

    private void Start()
    {
        if (textFile != null)
        {
            // textFile を使ってファイルの内容を読み込むことができます
            text = textFile.text;
            // ここでtextをパースしたり、必要な処理を実行したりできます
        }
        else
        {
            Debug.LogError("textファイルが選択されていません");
        }
    }
}
/// <summary>
/// テキストファイルをインスペクタ上で指定し、文字列で出力結果を得る
/// </summary> 
public interface IReadTextFromInspector
{
    /// <summary>
    /// テキストファイルをインスペクタ上で指定し、文字列で出力結果を得る
    /// </summary>
    /// <returns>出力結果の文字列の内容</returns> 
    string ReadText();
}

この例では、TextAssetタイプのフィールド textFile を持たせています。そして、UnityのInspectorで ReadTextFromInspectorコンポーネントを選択し、textFileフィールドにテキストファイルをドラッグアンドドロップで選択できるようになります。 ファイルが選択されていない場合に備えてエラーチェックも行っています。

インスペクタで指定したテキストファイルを読み込み、CSV形式をJson形式に変換しstring型として取得する

UnityでJSONからCSV、CSVからJSONへの相互変換を行うためのコードを提供します。以下のコード例では、JSONデータをCSVに変換し、CSVデータをJSONに変換する方法を示しています。

まず、CSVデータをJSONに変換するコードです。

using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;

public class CSVToJsonConverter : MonoBehaviour, IReadTextFromInspector
{
    public TextAsset csvData; // CSVデータをInspectorから指定
    private string jsonText;
    private void Start()
    {
        if (csvData != null)
        {
            jsonText = ConvertCSVToJson(csvData.text);
        }
        else jsonText = "";
    }
    public string ConvertCSVToJson(string csvText)
    {
        string[] csvLines = csvText.Split('\n');
        List<Dictionary<string, string>> jsonDataList = new List<Dictionary<string, string>>();

        string[] headers = csvLines[0].Split(',');

        for (int i = 1; i < csvLines.Length; i++)
        {
            string[] values = csvLines[i].Split(',');
            Dictionary<string, string> data = new Dictionary<string, string>();

            for (int j = 0; j < headers.Length; j++)
            {
                data[headers[j]] = values[j];
            }

            jsonDataList.Add(data);
        }
        return JsonConvert.SerializeObject(jsonDataList);
    }

    public string ReadText()
    {
        return jsonText;
    }
}

このスクリプトでは、InspectorからCSVデータを読み込み、CSVデータをJSONに変換してデバッグログに表示します。

インスペクタで指定したテキストファイルを読み込み、Json形式をCSV形式に変換しstring型として取得する

次に、JSONデータをCSVに変換するコードです。

using System.Collections.Generic;
using System.Text;
using UnityEngine;
using Newtonsoft.Json;
using System.Linq;

public class JsonToCSVConverter : MonoBehaviour, IReadTextFromInspector
{
    public TextAsset jsonData; // JSONデータをInspectorから指定
    private string csvString;
    private void Start()
    {
        if (jsonData != null)
        {
            csvString = ConvertJsonToCSV(jsonData.text); // JSONデータをCSVに変換(Startで呼び出し)
        }
        else csvString = "";
    }
    public string ConvertJsonToCSV(string jsonText)
    {

        List<Dictionary<string, string>> jsonDataList = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonText);

        if (jsonDataList.Count > 0)
        {
            List<string> headers = jsonDataList.First().Keys.ToList();
            StringBuilder csv = new StringBuilder();
            csv.AppendLine(string.Join(",", headers));

            foreach (var data in jsonDataList)
            {
                List<string> values = new List<string>();
                foreach (var header in headers)
                {
                    values.Add(data[header]);
                }
                csv.AppendLine(string.Join(",", values));
            }

            return csv.ToString();
        }
        else return "";
    }

    public string ReadText()
    {
        return csvString;
    }
}

このスクリプトでは、InspectorからJSONデータを読み込み、JSONデータをCSVに変換してデバッグログに表示します。JSONデータの各辞書はCSVの行に対応し、辞書のキーはCSVのヘッダーになります。

さいごに

これらのスクリプトをUnityプロジェクトに追加し、必要に応じてコンポーネントにアタッチして使用できます。また、JSONとCSVのフォーマットに合わせて適宜調整することができます。

これらのコードは基本的なサンプルです。必要があれば個別の用途に合わせて適宜調整して下さい。






このサイトをシェアする