🦁

【Unity】改行含むcsvファイルを読み込むプログラム

2024/01/28に公開

目的


  • csvファイルを改行込みで読み込みたい

このプログラムは以下のゲームを作る際の知見です。
https://note.com/tebasakigames/n/n590df471a021

結論

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

public class CSVReader : MonoBehaviour
{
    public TextAsset csvFile;
    public static List<List<string>> csvDatas = new List<List<string>>();

    // Start is called before the first frame update
    void Start()
    {
        ReadCSV();
        Debug.Log(csvDatas[4][2]); //列、行で指定できる
    }
    void ReadCSV()
    {
        using (StringReader reader = new StringReader(csvFile.text))
        {
            StringBuilder currentElement = new StringBuilder();
            List<string> lineData = new List<string>();
            bool inQuotes = false;

            int c;
            while ((c = reader.Read()) != -1)
            {
                switch (c)
                {
                    case '\"':
                        inQuotes = !inQuotes;
                        break;
                    case ',':
                        if (!inQuotes)
                        {
                            lineData.Add(currentElement.ToString());
                            currentElement.Clear();
                        }
                        else
                        {
                            currentElement.Append((char)c);
                        }
                        break;
                    case '\n':
                        if (!inQuotes)
                        {
                            lineData.Add(currentElement.ToString());
                            AddElementToLists(lineData);
                            lineData.Clear();
                            currentElement.Clear();
                        }
                        else
                        {
                            currentElement.Append((char)c);
                        }
                        break;
                    default:
                        currentElement.Append((char)c);
                        break;
                }
            }

            if (currentElement.Length > 0)
            {
                lineData.Add(currentElement.ToString());
                AddElementToLists(lineData);
            }
        }
    }

    void AddElementToLists(List<string> lineData)
    {
        if (csvDatas.Count < lineData.Count)
        {
            for (int i = csvDatas.Count; i < lineData.Count; i++)
            {
                csvDatas.Add(new List<string>());
            }
        }
        for (int i = 0; i < lineData.Count; i++)
        {
            csvDatas[i].Add(lineData[i].Trim()); //これがないと見えない空白が入って大変困る
        }
    }
}

追記

2024年1月30日

            csvDatas[i].Add(lineData[i].Trim()); //これがないと見えない空白が入って大変困る

trim関数を追加。trim使わないと辞書型のkeyとかに設定しているとKeyNotFoundとかになり地獄を見た(https://zenn.dev/link/comments/4d8d6b42e769be)

Discussion