프로그래밍/유니티 및 C#

[유니티/C#] csv 파일을 원하는 타입으로 읽기(Generic 사용)

바토파 2023. 11. 8. 20:15
반응형

 

string LINE_SPLIT_RE = @"\r\n|\n\r|\n|\r";
public List<T> ReadCSV<T>(string fileName) where T: CSVData, new()
{
    List<T> list = new List<T>();
    var data = Resources.Load(path + fileName) as TextAsset;

    string[] lines = Regex.Split(data.text, LINE_SPLIT_RE);
    
    for (int i = 1; i < lines.Length - 1; i++)
    {
        string[] values = lines[i].Split(',');
        for (int j = 0; j < values.Length; j++)
        {
            string value = values[j];

            value = Regex.Replace(value,"`", ",");
            values[j] = value;
        }

        T t = new T();
        t.csvToClass(values); // ,로 구분된 csv 데이터를 클래스의 형태에 맞게 변환
        list.Add(t); // 리스트에 추가해준다
    }
    
    return list;
}

Assets/Resources 폴더 안에 있는 csv 파일을 읽는 코드이다.

List<T> 형태의 객체를 반환하며 이때 객체는 CSVData를 상속받은 객체여야 한다.

 

[예제 코드]

public class CSVData
{
    public virtual void csvToClass(string[] csvArray)
    {
            
    }
}

public class Equipment : CSVData
{
    public string type;
    public int grade;
    public string name;

    public int HP;
    public int ATK;
    public int DEF;

    public List<int> probs;
        
    public override void csvToClass(string[] csvArray)
    {
        type = csvArray[0];
        grade = int.Parse(csvArray[1]);
        
        name = csvArray[2];
        HP = int.Parse(csvArray[3]);
        ATK = int.Parse(csvArray[4]);
        DEF = int.Parse(csvArray[5]);
        
        probs = new List<int>();
        for (int i = 6; i < csvArray.Length; i++)
        {
            probs.Add(int.Parse(csvArray[i]));
        }
    }
}

Equipment는 드롭 확률이 정해져 있는 장비의 정보를 담기 위한 클래스이다.

표와 같은 형태의 csv 파일을 만들어 Equipment에 담았다.

반응형