[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 |
[Unity3D-php] JSON Parsing error (array type)
php -> unity로 배열 값을 보낼 때, json_encode를 이용해서 보낼 시, unity에서 받은 값으로 바로 JsonUtility로 파싱 할 수 없다.
이는 php와 unity에서 json 파싱하는 형태가 다르기 때문이다.
잘못 파싱할 경우 뜨는 에러&문제와 함께 방법을 알아보자.
JsonUtility.FromJson 할 경우
1. NullReferenceException: Object reference not set to an instance of an object
2. ArgumentException: JSON must represent an object type.
3. 에러는 없고 변수에 값이 안 들어가거나(array type인데 Debug.Log로 Length 찍어보면 0이 나옴)
위와 같은 다양한 오류를 볼 수 있다.
그러면 다시 한번 파싱을 제대로 했는지 확인해야 한다.(어딘가 잘못 짰으니, 에러가 뜨는 거겠죠)
1번과 2번 문제의 경우, 파싱 에러 - 앞에 "Items" 값을 추가해야 된다.
_value = "{\"Items\":" + _value + "}";
// retrun value
// [{"key1":"A","key2":"B"},{"key1":"C","key2":"D"}]
// need type for translate to json
// {"Items":[{"key1":"A","key2":"B"},{"key1":"C","key2":"D"}]}
_value = "{\"Items\":" + _value + "}";
php에서 json_encode로 값을 보낼 경우, 윗 줄과 같이 오는데, unity에서 JsonUtility.FromJson을 사용하기 위해선 밑의 형태로 바꿔줘야 한다.(array type)
꼭 "Items" 값이 들어가야 하며, 그래도 위와 같은 에러가 뜰 경우 Debug로 괄호나 역슬러시, 큰따옴표 등 값이 제대로 들어갔는지 확인!
3번 문제의 경우, Serializable 선언을 확인해주자.
FromJson의 type의 class를 Serializable 선언해주자.
using System; // Serializable
[Serializable]
public class KeyClass
{
public string key1;
public string key2;
}
'프로그래밍 > Unity3D' 카테고리의 다른 글
[Unity3D/C#] CSVReader (엑셀 파일 리더기) (0) | 2021.07.24 |
---|---|
[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 |
[Unity3D/C#] Server returned an error: 500 STOR
System.Net.WebExceiption : Server returned an error: 500 STOR : command not understood. at System.Net.FtpWebRequest.EndGetRequestStream(System.IAsyncResult
Unity3D에서 C#으로 FTP 방식으로 서버에 파일 업/다운로드 중 뜬 에러.
해당 에러는 파일 다운로드 중 생겼습니다.
원인은 파일을 읽어야되는데, 어떤 이유에서든 읽을 파일의 경로를 벗어남.
ex) path에 "/"가 들어가서 파일이 있는 위치가 아닌 다른 위치를 확인함.
(파일 이름에 시간변수를 더해서 넣었더니 01/01/20 이런식으로 날짜가 들어갔음.)
없는 위치의 폴더를 찾고, 그곳의 권한도 없고,,,
덕분에 온갖 에러가 떴던것 같습니다 ㅜ_ㅜ
'프로그래밍 > C#' 카테고리의 다른 글
[c# / 셀레니움] 웹크롤링 (0) | 2020.12.06 |
---|---|
[c#/Excel] 엑셀 리더 (0) | 2020.12.06 |
[C#] 배열과 List의 차이 (0) | 2016.02.03 |
[C/C#] C언어와 C#언어의 차이 / 기타 ++ (0) | 2015.12.21 |
[C#] 부모클래스의 생성자 호출 (0) | 2015.12.19 |
ArgumentException: JSON parse error: Invalid value.
원인 : php에서 유니티로 json형태로 값을 보냈는데, 유니티에서 JsonUtility.FromJson 메소드를 썼더니 에러가 뜸.
해결 : System.Text.Encoding.UTF8.GetString(byte[] _byte, 3, _byte.Length-3);
받은 json형태의 값 앞에 이상한 값이 들어있음.
앞부분 3바이트를 잘랐더니 정상작동함.
참고 링크 : https://en.wikipedia.org/wiki/Byte_order_mark
Byte order mark - Wikipedia
Unicode character "FEFF" redirects here. For the airport in Central African Republic with the airport code FEFF, see Bangui M'Poko International Airport. For the program used in X-ray absorption spectroscopy, see FEFF (software). For the name of U+FEFF in
en.wikipedia.org
(추가) 2021. 04. 20
php -> unity로 값 전송 시 종종 뜨던 부분은
1. Trim() // return 값에 공백이 들어가던 문제
2. 위와 같은 3byte 이상한 값이 들어가던 문제
있었으며, 당일 기준 코딩 돌려보니 Trim()이나 3byte 제거 안 해도 정상 작동한 걸로 보아, 수정된 것으로 보인다.
위 문제 외 배열 값을 처리 시 기타 오류가 떴던 부분은 다음 게시물에서 참고.
2021.04.20 - [프로그래밍/Unity3D] - [Unity3D-php] JSON Parsing error (array type)
'프로그래밍 > 모르는것들!!' 카테고리의 다른 글
요청한 주소는 해당 컨텍스트에서 유효하지 않습니다. : AH00072 : make_sock: could not bind to address (0) | 2019.07.19 |
---|---|
액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했습니다 (0) | 2019.07.19 |
[Apache, PHP, MySQL] 설치 중 에러 (0) | 2019.07.17 |
[뷰포리아/Vuforia] app key is missing (0) | 2015.09.08 |
[Vuforia/뷰포리아] 3 -> 4이상 업뎃 ImageTracker Error (0) | 2015.09.08 |