[Unity3D/C#] CSVReader (엑셀 파일 리더기)
비주얼 같은 경우 NuGet 솔루션 패키지 관리에서 다운 받아서 사용했습니다.
(유니티에서 보자면... 에셋 스토어 - 무료 패키지 같은 느낌... 이랄까요!)
https://hungry2s.tistory.com/204?category=526895
그런데 유니티에서는 어떻게 써야 할지 찾아보았습니다.
유니티는 직접 코딩하거나 라이브러리를 다운 받아서(혹은 만들거나) 사용하고자 했는데, 더 쉬운 자료가 있네요.
굳이 힘들게 할 필요 없으니 이용해볼까 합니다.
이 엑셀 리드의 메커니즘은.
1. 엑셀 파일을 실행 후 다른 이름으로 저장 - csv(쉼표로 분리)로 저장 시 csv 파일로 저장이 됩니다.
2. csv 파일은 엑셀 파일의 각 열을 쉼표로 분리하여 저장합니다.
3. 저장된 데이터를 split(쉼표)로 잘라서 사용. - 끝 -
엑셀의 1행에는 header(머리말)이 들어가도록 돼 있어서, 보기도 쉽네요.
(리더기는 2행 1열부터 읽음)
엑셀 리드 코딩은 간단합니다.
구글링 합시다.
출처 : https://github.com/tikonen/blog/tree/master/csvreader
(2014년 9월 13일 자 글)
using UnityEngine;
using System;
using System.Collections;
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, object>> Read(string file)
{
var list = new List<Dictionary<string, 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, 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("\\", "");
object finalvalue = value;
int n;
float f;
if(int.TryParse(value, out n)) {
finalvalue = n;
} else if (float.TryParse(value, out f)) {
finalvalue = f;
}
entry[header[j]] = finalvalue;
}
list.Add (entry);
}
return list;
}
}
그리고 필요한 곳에서
List<Dictionary<string, object>> 변수명 = CSVReader.Read("파일명(확장자x)");
선언 후 데이터를 사용하면 된다.
for(int i=0; i<data_dialog.Count; i++)
{
Debug.Log("i : " + i + " [ " + 변수명[i]["damage"].ToString() + " ] " + " [ " + data_dialog[i]["hp"].ToString() + " ] ");
}
(ex) i : 1 [ 1 ] [ 1 ]
이런 식으로 출력된다.
다만, 필요에 따라 수정이 필요할 듯하다.
* 파일 경로 *
- 기본적으로 Resources.Load를 사용하기 때문에 Resources 폴더에 있는 csv를 사용하는 장점이자 단점이 있다.
서버나 다른 경로에서 읽어오기 위해서 stream으로 변경해서 사용하는 게 더 활용도가 높을 듯.
'프로그래밍 > Unity3D' 카테고리의 다른 글
[Unity3D-php] JSON Parsing error (array type) (0) | 2021.04.20 |
---|---|
[Unity3D/펌] 쉐이도 강좌 - 기초 (0) | 2016.07.08 |
[Unity3D]Rejected because no crossdomain.xml policy file was found (0) | 2015.12.24 |
[Unity3D/FacebookAPI] Unable to verify assembly data; you must provide an authorization key when loading this assembly. (0) | 2015.08.26 |
[Unity3D] 드로우 콜 (Draw Call)에 관하여 (0) | 2015.08.19 |
[c#/Excel] 엑셀 리더
초간단 설명.
1. NuGet 패키지로 Excel 패키지 추가.
2. using Excel = ""; // 엑셀 파일 접근
3. path클래스로 바탕화면 혹은 실행파일 기준 경로 설정 (파일 생성은 파일 스트림 검색)
4. 해당 파일 접근 후 시트 설정
5. 데이터 read or write
** Visual Studio 2019 버전 기준 설명입니다. **
1. 프로젝트를 실행한 후 NuGet 솔루션을 켭니다.
(도구 탭 - NuGet 패키지 관리자 - 솔루션용 NuGet 패키지 관리)
2. NuGet 솔루션 창에서 Excel을 검색하여 현재 패키지에 추가해줍니다.
3. Excel을 사용하기 위하여 상단에 using 선언.
using Excel = Microsoft.Office.Interop.Excel;
4. Excel 파일 접근 및 사용.
string path = Path.Combine("엑셀 파일 경로", "엑셀 파일명(확장자 포함)");
Excel.Application excelApp = new Excel.Application(); // 컴퓨터에 엑셀이 없을 경우 에러.
Excel.Workbook workBook = excelApp.Workbooks.Open(path);
Excel.Worksheet workSheet = workBook.Worksheets.get_Item(1) as Excel.Worksheet; // 엑셀 1번째 워크시트 가져오기
Excel.Range range = workSheet.UsedRange; // 사용 중인 셀 영역을 가져오기
string value = (string)(range.Cells[1, 1] as Excel.Range).Value2; // 오픈한 엑셀 파일의 워크시트에서 1행 1열 값을 가져온다.
* 반대로 저장도 가능하며, 메모리 해제를 해주지 않으면, 계속 엑셀이 실행 중임.
* 시트는 숫자로 하면 n번째 시트를 인식하며, 문자열을 통해 시트 이름을 찾을 수 있다.
* 경로는 Path클래스가 아닌 직접 string으로 입력해줘도 된다.
'프로그래밍 > C#' 카테고리의 다른 글
[c# / 셀레니움] 웹크롤링 (0) | 2020.12.06 |
---|---|
[Unity3D/C#] Server returned an error: 500 STOR (0) | 2020.01.08 |
[C#] 배열과 List의 차이 (0) | 2016.02.03 |
[C/C#] C언어와 C#언어의 차이 / 기타 ++ (0) | 2015.12.21 |
[C#] 부모클래스의 생성자 호출 (0) | 2015.12.19 |
[C#/Excel] 80040154 에러
Microsoft.Office.Interop.Excel 비주얼에서 C#언어를 사용해 FileStream을 하려고 하는 중 Excel 변수 초기화 도중 에러가 뜸.
using Excel = Microsoft.Office.Interop.Excel;
Excel.Application excelApp = null;
excelApp = new Excel.Application(); // 에러 구문
에러 메시지 : 80040154 클래스가 등록되지 않았습니다. (예외가 발생한 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)) 오류로 인해 CLSID가 {00024500-0000-0000-C000-000000000046}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다.
컴퓨터에 Excel이 설치되어 있지 않기 때문으로 추정.
'프로그래밍 > 모르는것들!!' 카테고리의 다른 글
[c#] element not interactable: element has zero size (0) | 2020.11.13 |
---|---|
[c#] stale element reference: element is not attached to the page document (0) | 2020.11.13 |
Google Play Service 중지 or 정보 확인 중... 무한 로딩 (0) | 2020.10.04 |
VCRUNTIME140.dll 에러 (0) | 2020.10.03 |
JSON_UNESCAPED_UNICODE (0) | 2019.09.17 |