csv 런타임에 파싱하는것과 csv를 미리 scripable object로 저장했을때
속도 차이는 50% ~ 90% 그 이상까지도 속도 차이가 난다.
엑셀파일
엑셀을 .csv로 export했을때 텍스트파일의 모습
CSV 파서
using UnityEngine;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.IO;
public class CSVParser : MonoBehaviour
{
public static List<string[]> Parse(string filePath)
{
List<string[]> parsedData = new List<string[]>();
try
{
using (StreamReader reader = new StreamReader(filePath))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
string[] fields = ParseCSVLine(line);
parsedData.Add(fields);
}
}
}
catch (IOException e)
{
Debug.LogError("Error reading CSV file: " + e.Message);
}
return parsedData;
}
private static string[] ParseCSVLine(string line)
{
List<string> fields = new List<string>();
string pattern = @"(?:^|,)(?=[^""]|("")?)""?((?(1)[^""]*|[^,""]*))""?(?=,|$)";
foreach (Match match in Regex.Matches(line, pattern))
{
fields.Add(match.Groups[2].Value.Trim());
}
return fields.ToArray();
}
}
CSV 파서 데이터
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.IO;
public class CSVParserEditorWindow : EditorWindow
{
private string csvFilePath = "";
private List<string[]> parsedData;
private Vector2 scrollPosition;
[MenuItem("Tools/CSV Parser")]
public static void ShowWindow()
{
GetWindow<CSVParserEditorWindow>("CSV Parser");
}
private void OnGUI()
{
GUILayout.Label("CSV Parser", EditorStyles.boldLabel);
EditorGUILayout.Space();
csvFilePath = EditorGUILayout.TextField("CSV File Path", csvFilePath);
if (GUILayout.Button("Browse"))
{
string path = EditorUtility.OpenFilePanel("Select CSV File", "", "csv");
if (!string.IsNullOrEmpty(path))
{
csvFilePath = path;
}
}
if (GUILayout.Button("Parse CSV"))
{
if (string.IsNullOrEmpty(csvFilePath))
{
EditorUtility.DisplayDialog("Error", "Please specify a CSV file path.", "OK");
return;
}
if (!File.Exists(csvFilePath))
{
EditorUtility.DisplayDialog("Error", "File not found at the specified path.", "OK");
return;
}
parsedData = CSVParser.Parse(csvFilePath);
Debug.Log(parsedData);
var csvData = ScriptableObject.CreateInstance<CSVData>();
csvData.SetData(parsedData);
EditorUtility.SetDirty(csvData);
AssetDatabase.CreateAsset(csvData, "Assets/20240719/csvData.asset");
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
EditorUtility.DisplayDialog("Success", $"Parsed {parsedData.Count} rows from the CSV file.", "OK");
}
EditorGUILayout.Space();
if (parsedData != null && parsedData.Count > 0)
{
EditorGUILayout.LabelField("Parsed Data:", EditorStyles.boldLabel);
scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition);
for (int i = 0; i < parsedData.Count; i++)
{
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField($"Row {i}:", GUILayout.Width(50));
EditorGUILayout.LabelField(string.Join(", ", parsedData[i]));
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.EndScrollView();
}
}
}
csvData
using System;
using UnityEngine;
using System.Collections.Generic;
[Serializable]
public struct CSVDataModel
{
public int data1;
public int data2;
public int data3;
public int data4;
}
[CreateAssetMenu(fileName = "New CSV Data", menuName = "CSV/CSV Data")]
public class CSVData : ScriptableObject
{
[SerializeField]
private List<CSVDataModel> models = new List<CSVDataModel>();
public void SetData(List<string[]> newData)
{
foreach (var stringse in newData)
{
CSVDataModel model = new CSVDataModel();
if (!int.TryParse(stringse[0], out model.data1))
{
model.data1 = 0;
}
if (!int.TryParse(stringse[1], out model.data2))
{
model.data2 = 0;
}
if (!int.TryParse(stringse[2], out model.data3))
{
model.data3 = 0;
}
if (!int.TryParse(stringse[3], out model.data4))
{
model.data4 = 0;
}
models.Add(model);
}
}
}
'UNITY > 유니티게임스쿨' 카테고리의 다른 글
프로토버퍼 (0) | 2024.09.23 |
---|---|
유니티 UI 이해 :: UI 스프라이트, 한글폰트 설정, 버튼 작성하기 (1) | 2024.06.10 |
Unity 비동기 프로그래밍 :: Node.js 설치, 간단한 비동기 서버 구축 (0) | 2024.06.07 |
[유니티게임스쿨 TIL] 유니티 기본 :: 캐릭터 애니메이션 설정하기, 트리거 활용하기 (0) | 2024.06.05 |
[유니티게임스쿨 TIL] C# 기초 문법 이해 :: 파일 입출력, Collection, LINQ (0) | 2024.06.04 |