강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지

데이터 테이블 관리 시스템 (DataTableManager, CSVReader)

CSVReader 자세하게 설명 가능하신가요?

해결된 질문

작성

·

151

·

수정됨

0

다른 프로젝트에서 사용하고 싶은데 자세하게 설명 가능하신가요?

답변 1

0

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

안녕하세요! BurningCarrot입니다. 문의해 주신 내용에 답변 드립니다.

 

일단 CSV파일은 Resources 폴더 하위에 위치해야 하고, Read 함수 호출 시 매개 변수는 Resources 폴더 내의 CSV파일 경로(파일명 포함, 파일 확장자명은 X)로 설정해 주시면 됩니다. ChapterDataTable.csv 파일을 읽어오면 어떤 자료구조의 형태로 받아오게 되는지는 아래 스크린샷을 참고 부탁 드립니다.

image.png

만약 조금 더 복잡한 구조의 csv파일을 변환하고 싶으실 경우 예시를 첨부해 주시면 좀 더 상세히 도움 드리겠습니다.

moonfgg님의 프로필 이미지
moonfgg
질문자

1개의 컬럼에 값들이 전부 하나씩 들어가 있는데 여러개의 값(생각중인 타입은 string입니다)을 구분자를 이용하여 넣고

key에 해당하는 value를 가져온뒤 구분자를 사용했으니 split으로 구별하여 여러 개의 값을 사용 가능한가요?

image.png


현재 script 부분이 4개로 나누어져 있는데

한 곳에서 모든 걸 다 입력하고 코드에서는 다시 4개로 나누어서 사용하고 싶어요

그리고 static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";

이 부분 설명 듣고싶습니다
감사합니다!

BurningCarrot님의 프로필 이미지
BurningCarrot
지식공유자

static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"; 는 csv파일의 한 행에서 따옴표를 기준으로 데이터를 분리하는 기능을 합니다.

수강생 분의 csv파일을 읽어오려면 아래와 같은 코드로 작성하시면 되겠습니다. 각 컬럼의 값을 한번 더 SPLIT_RE 로 분리하여 리스트로 저장하는 방식을 취했습니다.

using UnityEngine;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class CSVReader
{
    static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
    static string LINE_SPLIT_RE = @"\r\n|\n\r|\n|\r";
    static char[] TRIM_CHARS = { '\"' };

    public static List<Dictionary<string, List<object>>> Read(string file)
    {
        var list = new List<Dictionary<string, List<object>>>();
        TextAsset data = Resources.Load(file) as TextAsset;

        var lines = Regex.Split(data.text, LINE_SPLIT_RE);

        if (lines.Length <= 1) return list;

        var header = Regex.Split(lines[0], SPLIT_RE);
        for (var i = 1; i < lines.Length; i++)
        {
            var values = Regex.Split(lines[i], SPLIT_RE);
            if (values.Length == 0 || values[0] == "") continue;

            var entry = new Dictionary<string, List<object>>();
            for (var j = 0; j < header.Length && j < values.Length; j++)
            {
                string value = values[j];
                value = value.TrimStart(TRIM_CHARS).TrimEnd(TRIM_CHARS).Replace("\\", "");

                var splitedValues = Regex.Split(value, SPLIT_RE);
                List<object> finalValue = new List<object>();
                foreach (var item in splitedValues)
                {
                    int n;
                    float f;
                    object itemValue = item;
                    if (int.TryParse(item, out n))
                    {
                        itemValue = n;
                    }
                    else if (float.TryParse(item, out f))
                    {
                        itemValue = f;
                    }
                    finalValue.Add(itemValue);
                }
                entry[header[j]] = finalValue;
            }
            list.Add(entry);
        }
        return list;
    }
}
moonfgg님의 프로필 이미지
moonfgg

작성한 질문수

질문하기