🦁
【Unity】改行含むcsvファイルを読み込むプログラム
目的
- csvファイルを改行込みで読み込みたい
このプログラムは以下のゲームを作る際の知見です。
結論
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