Ruya Games

(Android, iOS) Unity에서 CSV파일 사용하기 - CSVHelper Library 사용 본문

Unity/에셋 | 패키지

(Android, iOS) Unity에서 CSV파일 사용하기 - CSVHelper Library 사용

SadEvil 2024. 6. 11. 09:10

유니티에서 CSV를 사용하는 방법을 두가지 적으려고 합니다.

저는 Android, iOS환경에서 동작하는 앱을 개발하기 때문에, 플랫폼별로 경로 설정부분이 약간 달라질 수 있습니다.


첫번째는 단순히 파일을 StreamReader를 사용해서 한줄씩 읽는 방식입니다.

using System;
using System.IO;

...

static void ReadCSV()
{
    string filePath = "yourfile.csv";

    using (StreamReader sr = new StreamReader(filePath))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            string[] values = line.Split(',');

            // values 배열에는 CSV의 각 필드가 저장됩니다.
            foreach (var value in values)
            {
            	Debug.Log(value + " ");
            }
        }
    }
}

이게 기본적인 csv파일을 읽는 방식이며, 특별히 다른 패키지를 추가로 설치하지 않고 csv파일을 읽습니다.

여기서 csv파일을 StreamingAssets폴더에 저장하고 Android와 iOS 환경에서 불러온다고 한다면 아래와 같이 사용할 수 있습니다.

 

 

public static void ReadCSV()
{
    #if UNITY_IPHONE
    var path = Application.streamingAssetsPath + "/yourFile.csv";
    using var sr = new StreamReader(path);

    #elif UNITY_ANDROID
    var path = "yourFile.csv";
    var sr = BetterStreamingAssets.ReadAllLines(path);
    #endif

    #if UNITY_IPHONE
    while (sr.ReadLine() is { } line)
    {
    #elif UNITY_ANDROID
    foreach (var line in sr)
    {
    #endif
        var values = line.Split(',');

        foreach(var value in values
        {
            Debug.Log(values);
        }
    }
}

Android의 경우에서는 StreamingAssets 폴더에 접근하기 위해 Better Streaming Assets라는 에셋을 사용했습니다.

무료이고, 사용이 간편하니 추천드립니다.

 

아무튼 이렇게 외부 에셋 없이 csv를 읽는 첫번째 방법이 있습니다.


 

2번째 방법으로는 CSVHelper라는 라이브러리를 사용하는 방법입니다.

저는 첫번째 방법으로 csv파일을 불러와서 사용하다가 데이터 안의 ,(반점)이 있는경우에 읽어들이기에서 에러가 발생하는 문제가 있어서 CSVHelper를 사용하는 방식으로 변경하였습니다.

 

CSVHelper를 사용하려면 먼저 다운을 받아야하는데, 아래의 공식 다운로드 페이지에서 다운받습니다. 전 다운수가 제일 높은 30.0.1 버전으로 다운받았습니다. 아래 페이지 오른쪽의 download Package 버튼을 클릭하면 .nupkg형식의 파일을 다운로드 할 수 있습니다.

https://www.nuget.org/packages/CsvHelper/

 

CsvHelper 32.0.3

A library for reading and writing CSV files. Extremely fast, flexible, and easy to use. Supports reading and writing of custom class objects.

www.nuget.org

다운로드 한 후, 확장자를 .zip으로 변경해서 압축을 풀어주면 아래와 같은 파일들이 들어있을텐데요. lib 폴더 안에 있는 dll파일중 버전에 맞는 폴더 안의 dll 파일을 사용하면 됩니다. 저는 유니티 프로젝트의 .NET Api Compatibility Level에 맞춰서 netstandard2.1 버전을 사용했습니다.

유니티 에디터에서 Project Settings > Other Settings 탭에서 확인 가능합니다.

 

어쨌건 버전에 맞는 CsvHelper.dll파일을 이제 프로젝트에 넣어주면 됩니다. 프로젝트 폴더 안에 Plugins라는 폴더를 생성해주고(있으면 그대로 사용), 그 폴더 안에 dll파일을 넣어주면 이제 프로젝트 안에서 사용 가능합니다.

만약 종속성 문제가 발생해서 정상적으로 사용할 수 없다면 System.Text.JsonSystem.Memory 패키지를 동일한 방법으로 다운받아서 plugins 폴더에 넣어주세요.

 

이제 CSVHelper를 사용하는 방법입니다.

using System.IO;
using CsvHelper;

...

    public static void ReadCSV()
    {
        TextReader reader;

        #if UNITY_IPHONE
	var path = Application.streamingAssetsPath + "/yourFile.csv";
        reader = new StreamReader(path);

        #elif UNITY_ANDROID
        var path = "yourFile.csv";
        var fileContent = BetterStreamingAssets.ReadAllText(path);
        reader = new StringReader(fileContent);
        #endif

        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            while (csv.Read())
            {
            	Debug.Log(csv.GetField<int>(0));
                Debug.Log(csv.GetField<double>(1));
                Debug.Log(csv.GetField<string>(2));
            }
        }
    }
}

while문 안에서 매 loop마다 하난의 행씩 읽으며, 각 0,1,2의 각 인덱스는 각 열에 있는 정보들입니다. csv.GetField<type>(index)를 사용해서 읽어올 수 있습니다.


제 필요에 의해 기본적인 기능만 적었지만 CSVHelper 라이브러리는 이 외에 .csv파일을 사용하는 많은 기능을 지원하며, 사용법도 간편하고 성능도 좋기 때문에 대용량 .csv파일의 처리도 빠르게 가능합니다. 그리고 linq와 함께 사용이 가능하기 때문에 csv를 많이 써야된다면 프로젝트 안에서 사용하기 좋아보입니다.