데이터를 가공하기 위해서는 python, lua 같이 그런쪽에 특화된 인터프린터 언어가 있긴하지만
처음 접해보면 기존 C / C++ / C# 같은 컴파일러 언어 유저들에게는 쉽지 않다.
(나만 그럴수도? 나는.. 너무 불편하다..)
게임 개발에 있어서는 C# 으로 쓰게 되면 아무래도 unity 개발자의 경우는 좀 더 코드 파악이 쉽다는 장점이 있다.
그래서 C#으로 만들어보고 싶었다.
게임 개발 시에 대부분 엑셀을 이용해서 기획자가 데이터를 작업을 해주고 해당 엑셀 파일을 이용해
추가 프로그램으로 yml이나 xml이나 json 같은 형태로 변환한다.
이후 클라이언트에서 저장된 파일을 메모리에 로드해서 사용하게 된다.
혹은 직접 엑셀이 아닌 csv 형태로 저장해서 그대로 사용도 가능하다.
만약 엑셀 파일을 그대로 이용하게 된다면 파일이 너무 커서 용량을 증가시키기 때문에
비효율적이다. 따라서 대부분은 변환을 거쳐 다이어트를 시킨 후 사용하게 된다.
오늘 다뤄볼 부분은 Excel를 C#으로 가져오는 부분 먼저 다뤄볼까 한다.
우선 ExcelDataReader NuGet을 받아준다!
이것만 하면 준비는 끝났다!
(아 참고로 Unity의 경우는 Idle에서 NuGet Package를 직접 넣는 것은 불가능하다. 글을 쓰고 링크를 걸어 두겠다)
본격적으로 사용방법
1. 일단 파일을 읽어온다.
어차피 수정은 하지 않을 테니 Read 권한으로만 읽어온다.
var로 선언했지만 FileStream 변수가 선언된다.
var stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
2. 해당 파일을 ExcelReaderFactory를 이용해 IExcelDataReader 변수로 선언해 준다.
var reader = ExcelReaderFactory.CreateReader(stream);
3. DataSet으로 변환을 다시 해준다. 이때 ExcelDataSetConfiguration을 이용해 옵션을 설정해줄 수 있다.
DataSet dataSet = reader.AsDataSet(
new ExcelDataSetConfiguration()
{
UseColumnDataType = true,
});
- 대충 디컴파일 해보면 요런 속성을 설정해 줄 수 있는 듯하다.
public class ExcelDataSetConfiguration
{
//Gets or sets a value indicating whether to set the DataColumn.DataType property
//in a second pass.
public bool UseColumnDataType { get; set; } = true;
//Gets or sets a callback to obtain configuration options for a DataTable.
public Func<IExcelDataReader, ExcelDataTableConfiguration> ConfigureDataTable { get; set; }
//Gets or sets a callback to determine whether to include the current sheet in
//the DataSet. Called once per sheet before ConfigureDataTable.
public Func<IExcelDataReader, int, bool> FilterSheet { get; set; }
}
4. Tables를 불러온다. 여기서 Tables 란 엑셀에서의 각 시트를 의미한다. dataSet.Tables[n] 은 n번째 시트라는 의미이다.
DataTable table = dataSet.Tables[n];
5. 각 테이블의 row를 불러온다.
- 여기서 row 란 가로줄을 말한다. 엑셀데이터의 한 줄 한 줄.
- n 번째 row에 있는 m 번째 컬럼의 값을 가져오고 싶다. 일 때 가져올 수 있는 방법이다.
- 해당 값을 가져온 다음에 원하는 저장하고 싶은 변수형으로 저장하면 된다.
<주의할점 >
- 모든 숫자값은 double을 기본 형으로 읽어온다.
따라서 int로 사용하고 싶으면 floor 함수를 이용해 int 로 변환해야 한다. 아니면 읽을 때 에러가 날 수 있다.
- int 나 float 값은 nullable이다. 파일로 변환 후 저장 시 null 일경우의 디폴트 값을 지정해 주는 게 좋다.
table.Rows[n].ItemArray[m]
요 5개만 할 줄 알면 file로 뽑을 수는 없지만 누구든 메모리에 올려보고 원하는 방향으로 데이터를 가공할 수는 있다.
다음시간에는 해당 방법으로 뽑은 데이터를 json으로 변환하는 부분을 작성해볼까 한다.
Unity에서 NuGet Package를 넣는 방법도 다음글 즈음에 동시에 올려볼 예정이다.
ExcelDataReader 더 많은 기능이 있지만 모두 서술하기엔 길어질까 봐 필요한 내용만 적었다.
더 궁금한 내용이나 반박할 부분이 있다면 댓글로! 언제든 환영입니다.
'언어공부 > C# 공부' 카테고리의 다른 글
변수명 짓는 방법: 코드 가독성을 높이는 핵심 요소 (0) | 2023.11.19 |
---|---|
c# const vs readonly vs init (0) | 2023.11.05 |
다양한 C# Switch 문의 세계 (0) | 2023.04.15 |
nullable 이란 ? (bool? int? ) (0) | 2023.04.13 |
Struct VS Class VS Record (0) | 2023.04.10 |