본문 바로가기
Engine/Unity

Unity에서 csv 파일 읽어오기(엑셀, 메모장)

by 뇌 속의 통 2025. 7. 8.

CSV 파일이란?

Comma Separated Values의 약자로 쉼표(,)로 구분된 텍스트 기반 데이터 파일을 말합니다.

 

Name,Age,Gender
DH,30,Male
GH,31,Male

 

위와 같이 작성된 파일로 보면 각 줄은 행(Row)을 한 줄안에서 ,로 각 열(Column)으로 나타난다.

 

이렇게 봐서 잘 모르겠다면, 엑셀로 해서 봐보자.

 

 

표로 보면 훨씬 더 이해하기가 쉽다. 그러나 컴퓨터는 이 표 자체를 인식할 수 없기 때문에 다른 형식으로 변환하여야 하는데 그 중 하나가 csv 파일이다.

 

한쇼2020 기준으로 내가 표를 만들고 그 파일을 csv 파일로 바꾸는 방법은 간단하다.

새로 표를 하나 만든 다음 저장을 -> 다른 이름으로 저장 -> 저장될 파일 형태 csv

 

 

이렇게 저장한 csv 파일은 유니티의 Asset 폴더에 넣도록 하자.

이제 유니티에서 csv 파일을 읽어오는 코드를 작성하면 된다.

 

string path = Application.dataPath + "/저장한 파일명.csv";

StreamReader fileReader = new StreamReader(path);

 

Asset 폴더의 path인 Application.dataPath에 내가 넣은 파일명 + 확장자를 넣어 최종 Path를 기재한다.

그리고 StreamReader 클래스를 이용하여 해당 파일을 읽어올 객체를 생성한다.

 

 public class Employee
 {
     public string Name;
     public int Age;
     public string Gender;
 }

 

불러온 csv 파일에서 하나의 레코드 값이 하나의 객체가 되도록 새로운 클래스를 하나 만들어 주었다.

Gender(성별)의 경우에는 M 또는 W, 2개의 값만 사용하므로 Enum으로 선언하여 사용할 수도 있다.

 

List<string> result = new List<string>();

while (!fileReader.EndOfStream)
{
    string data = fileReader.ReadLine();
    
    if (string.IsNullOrWhiteSpace(data)) 
    	continue;
        
    bool inQuotes = false;
    string current = "";

    for (int i = 0; i < data.Length; i++)
    {
      char c = data[i];
      
      if (c == '"')
      {
       if (inQuotes && i + 1 < data.Length && line[i + 1] == '"')
        {
          current += '"';
          i++;
        }
        else
          inQuotes = !inQuotes;
      }
      else if (c == ',' && !inQuotes)
      {
         result.Add(current.Trim());
         current = "";
      }
      else
         current += c;
    }
     
    Employee = new Employee
    {
        Name = result[0],
        Age = int.Parse(result[1]),
        Gender = result[2],
    };
    
}

 

이제 가장 어려운 부분이 남았다.

실제로 읽어온 csv 파일을 쪼개서 읽는 부분.

 

어려워보이지만 한 줄씩 보다보면 쉽게 이해할 수 있다.

 

우선 해당 파일을 끝까지 읽을 때까지 계속 반복문을 돌리기 위해 while문을 쓰며, 조건으로 fileReader.EndOfStream 변수를 사용한다.

 

반복문 안에서는 다음과 같은 동작이 이뤄진다.

 

1. 한 줄씩 읽어온다. == 표에서 각 열을 읽어온다.

2. 읽어온 내용이 비어있는지 확인 및 예외처리한다.

3. 문장안에 " 큰 따옴표가 있는지 확인할 bool 변수, 현재 필드 문자열을 임시로 저장할 current 버퍼, 각 레코드 값을 하나씩 저장할 string List 생성.

4. 두번째 반복문 진행한다. 한 줄을 읽어온 후 글자 하나하나 나눠서 ,와 "를 찾아 처리한다.

5. " 를 만난다면 bool 변수를 true로 설정함 -> 다음 " 를 만나면 bool 값이 true이므로 첫번째 예외로 빠지며 직전까지의 글자를 하나의 단어로 보고 result에 하나의 string으로 저장한다.

5. , 를 만나면 직전까지의 글자를 하나의 레코드 값으로 보고 result에 하나의 string으로 저장한다.

6. 이렇게 한 줄을 쪼개어 result List에 넣고나면 이를 바탕으로 객체 생성 및 데이터를 할당해준다.

 

여기서 따로 처리하진 않았지만 보통은 Employee은 Dictionary로 만들어서 앞서 생성한 객체를 모두 넣고 필요할때마다 해당 데이터를 찾아 사용하는 방식으로 많이 사용한다. Key 값은 열의 데이터 중 하나로 설정.

 

예를 들어

ID : 131

Name : potion

Price : 100

 

포션이라는 아이템을 유저가 먹으면 서버에서는 해당 ID 값만 먹었다라고 하고, 클라이언트의 PC에서 데이터 테이블을 찾아 해당 아이템의 정보를 사용자에게 표시해준다.

 

csv 파일도 결국 단순히 ,를 이용하여 구분하는 것이므로 그냥 메모장 하나 켜서 

ID, Name, Price

131,potion,100

 

이렇게 써도 무방하다.

 

'Engine > Unity' 카테고리의 다른 글

유니티 DataBase 연동하기(MariaDB)  (4) 2025.07.28
Sprite Shape을 이용하여 땅 만들기(Unity 2D)  (2) 2025.07.18
Unity에서 JSON 사용하기  (1) 2025.07.07
Unity Coroutine  (0) 2025.02.20
Unity Drag & Drop  (0) 2025.02.19