음.. 팀 프로젝트를 진행하다가 몬스터나 아이템, 스킬 등 정보가 필요한 객체에 대하여 하드코딩을 주로 하게 된다. 그럼 빌드 할때 말고는 변경해야되는 데이터가 변하지 않는 문제가 발생하게 되는데 이런 문제를 해결하기 위해서는 csv(쉼표로 구분되는 데이터) 형식이나 json 같은 직렬화한 데이터가 필요하다. 그중에서 json 을 사용하는 방법 말고 csv 파일을 사용하여 데이터를 동적으로 관리하는 법을 공유하려고 한다.
흔히 csv 파일은 ',' 로 필드를 구분한다. 그래서 메모장으로 열어보면
Level,MaxExp,StatStr,StatDex,StatInt,StatLuck,BonusPoint
1,100,5,5,5,5,3
2,230,5,5,5,5,3
3,374,5,5,5,5,3
이런식으로 저장된다. 단순한 구조라 column이 한 두개면 보기 편한데... 수가 많아지면 보기 많이 힘들어진다.. 그러면 작성은 어떤식으로 하면 좋으냐

그럼 준비된 파일을 가지고 어떤식으로 읽어오냐하면
public class Person
{
public string Name;
public int Age;
public string Email;
}
\n을 구분으로 Split을 한 뒤 text 배열로 가지고 있거나, StreamReader를 열고 Line by line 으로 읽어서 text 배열 형태로 가지고 있다가, 배열을 하나씩 순회하면서 ','로 다시 Split한 뒤 필드를 나눠서 column 순서에 맞게 객체를 인스턴스화 하여 변수에 할당해주면 된다. public List<Person> ReadCsvFile(string filePath)
{
List<Person> people = new List<Person>();
// StreamReader를 사용해 파일을 읽음
using (StreamReader reader = new StreamReader(filePath))
{
string line;
// 첫 번째 줄은 헤더이므로 건너뜀
reader.ReadLine();
// 파일의 끝까지 줄 단위로 읽음
while ((line = reader.ReadLine()) != null)
{
// 각 줄을 ','로 구분하여 배열에 저장
string[] values = line.Split(',');
// Person 객체를 생성하고 값을 설정
Person person = new Person
{
Name = values[0].Trim(), // 첫 번째 열: 이름
Age = int.Parse(values[1].Trim()), // 두 번째 열: 나이
Email = values[2].Trim() // 세 번째 열: 이메일
};
// 리스트에 추가
people.Add(person);
}
}
return people;
}
지금은 단순하게 null과 타입을 고려하지 않고 변수에 할당하고 있지만, 동적으로 할당하기 위해서는 null과 field타입의 순서, 값 타입 등을 고려해서 삽입해야한다.
예를 들면 이런식
Person loaderData = new Person();
var fields = GetFieldsInBase(typeof(Person)); //클래스의 필드만 가져옴.
for (int f = 0; f < fields.Count; f++)
{
FieldInfo? field = loaderData.GetType().GetField(fields[f].Name);
if (field == null)
continue;
Type type = field.FieldType;
if (field.Attributes.ToString().Contains("NotSerialized"))
{
continue;
}
try
{
if (type.IsGenericType)
{
object? value = ConvertList(row[f], type);
field.SetValue(loaderData, value);
}
else
{
object? value = ConvertValue(row[f], field.FieldType);
field.SetValue(loaderData, value);
}
}
catch (Exception e)
{
throw new Exception($"{filename}Data.csv {l} row {f} field error: {e.Message}");
}
}
그럼 fixed 데이터를 따로 빌드를하지 않더라도 csv 파일만 수정하면 동적으로 관리할 수 있게 된다.
근데 단점은 하나 있다.
아무래도 관리 목적으로 관계 테이블을 모방한 것이긴 하지만 1:n, n:n 관계에 대해서는 생각해봐야할 것이 많아진다.