[StarChaser] 로그라이크 게임 프로젝트

[유니티/C#] DataTable로 엑셀 csv파일 읽어오기

진서박 2023. 5. 5. 13:13
반응형

DataTable을 사용해서 csv파일을 읽어와 게임 내 데이터를 관리하려고 했다. 하지만 전체 테이블과 행을 읽어오는것은 되는데 string으로 열을 불러와도 "" 이런식으로 빈 값만 반환되었다.

 

DataManager 스크립트

// 리소스화 시킬 데이터테이블의 종류 열거형
public enum ECSVDatas
{
    PlayerTable = 0,
    MonsterTable,
    End
}

public class DataManager
{
	// 불러올 데이터테이블 딕셔너리
    public Dictionary<ECSVDatas, DataTable> tableDic { get; private set; } = new Dictionary<ECSVDatas, DataTable>();
	
    // 생성자 호출 시 자동으로 csv를 불러와 딕셔너리에 저장
    public DataManager()
    {
        TableInit();
    }
	
    // Paht에 있는 csv를 불러와 딕셔너리에 저장
    private void TableInit()
    {
        tableDic.Add(ECSVDatas.PlayerTable, CSVReader(Application.streamingAssetsPath + @"\DB\PlayerData.csv"));
        tableDic.Add(ECSVDatas.MonsterTable, CSVReader(Application.streamingAssetsPath + @"\DB\MonsterDB.csv"));
    }

	// csv의 행과 열을 각각 읽어와 리턴
    public DataTable CSVReader(string path)
    {
        DataTable dt = new DataTable();

        StreamReader sr = new StreamReader(path);
        string[] headers = sr.ReadLine().Split(',');
        foreach (string header in headers)
        {
            dt.Columns.Add(header);
        }

        while (!sr.EndOfStream)
        {
            string line = sr.ReadLine();
            string[] data = line.Split(',');

            DataRow row = dt.NewRow();
            for (int i = 0; i < headers.Length; i++)
            {
                row[i] = data[i];
            }
            dt.Rows.Add(row);
        }

        return dt;
    }
}

 

해당 스크립트로 불러왔는데, 입력값이 string이라서 string으로 읽어오는 줄 알고있었다. 그런데 디버그를 찍어보니 string이 아니라 char로 데이터를 읽어오는 것이었다.

 

    public float CSVDataLoad(int csvIndex, string csvDataName)
    {
    	// 작동이 안되었던 기존 코드
    	// return (float)(GameManagers.DataManager.tableDic[ECSVDatas.MonsterTable].Rows[csvIndex][csvDataName]);
    	
        // 파싱을 다시 해주고, 불러온 char값을 string으로 변환해주니 해결
        return float.Parse(GameManagers.DataManager.tableDic[ECSVDatas.MonsterTable].Rows[csvIndex][csvDataName].ToString());
    }

char형을 명시적으로만 float으로 변환하려고 시도해서 실패한 것이었다.

 

읽어온 값을 ToStrig()으로 string으로 변환시켜주고, 다시 float.Parse로 다시 캐스팅 해줌으로써 해결하였다

 

진짜 별거 없는 문제였는데, 라이브러리 이해의 부족으로 2시간을 버렸다..

반응형