KDT Unity 5주차 팀 프로젝트
2024-02-05 TIL
CSV파일을 가져와 딕셔너리로 변환하기 및 편집
CSV파일을 가져와 변환하여 쓰기 편하게 만드는 메서드 정리
각 값들은 enum으로 관리하여 오타 발생을 최대한 억제하고자 했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
public TextAsset CSVLoader(Define.CSV csv)
{
string name = Enum.GetName(typeof(Define.CSV), csv);
return Resources.Load<TextAsset>(name);
}
/// <summary>
/// CSV파일을 첫번째 열을 키값으로 하여 행단위로 나누는 메서드
/// </summary>
/// <returns></returns>
public Dictionary<string, string[]> CSVWidthCutting(TextAsset csvText)
{
// 줄바꿈('\n')을 기준으로 CSV 데이터를 행(row)으로 분리합니다.
string[] data = csvText.text.Split(new char[] { '\n' });
Array.Resize(ref data, data.Length - 1);
// 첫 번째 열을 키로, 나머지 열을 값으로 가지는 딕셔너리를 생성합니다.
Dictionary<string, string[]> dict = new Dictionary<string, string[]>();
// 각 행을 처리합니다.
for (int i = 0; i < data.Length; i++)
{
// 쉼표(',')를 기준으로 각 행을 열(column)로 분리합니다.
string[] row = data[i].Split(new char[] { ',' });
// 첫 번째 열을 제외한 나머지 열을 저장할 배열을 생성합니다.
string[] values = new string[row.Length - 1];
// 나머지 열들을 배열에 저장합니다.
for (int j = 1; j < row.Length; j++)
{
if (row[j] != null) values[j - 1] = row[j];
//null대신 ""인 빈값을 사용하고 싶을 때 위아래 바꾸면 됩니다.
//values[j - 1] = row[j] ?? "";
}
// 첫 번째 열(row[0])을 키로, 나머지 열들(values)을 값으로 딕셔너리에 저장합니다.
dict[row[0]] = values;
}
return dict;
}
/// <summary>
/// CSV파일을 첫번째 행을 키값으로 하여 열단위로 나누는 메서드
/// </summary>
/// <returns></returns>
public Dictionary<string, string[]> CSVLengthCutting(TextAsset csvText)
{
// 줄바꿈('\n')을 기준으로 CSV 데이터를 행(row)으로 분리합니다.
string[] data = csvText.text.Split(new char[] { '\n' });
Array.Resize(ref data, data.Length - 1);
// 첫 번째 행을 키로 사용합니다.
string[] keys = data[0].Split(new char[] { ',' });
// 각 키에 대한 값들을 저장할 딕셔너리를 생성합니다.
Dictionary<string, string[]> dict = new Dictionary<string, string[]>();
for (int j = 0; j < keys.Length; j++)
{
// 각 키에 대한 값을 저장할 배열을 생성합니다.
dict[keys[j]] = new string[data.Length - 1];
//Debug.Log(keys.Length);
}
// 두 번째 행부터 데이터를 처리합니다.
for (int i = 1; i < data.Length; i++)
{
string[] row = data[i].Split(new char[] { ',' });
for (int j = 0; j < keys.Length && j < row.Length; j++)
{
// 첫 번째 행의 각 열을 키로, 현재 행의 같은 열을 값으로 저장합니다.
if (row[j] != null) dict[keys[j]][i - 1] = row[j];
//null대신 ""인 빈값을 사용하고 싶을 때 위아래 바꾸면 됩니다.
//dict[keys[j]][i - 1] = row[j] ?? "";
}
}
return dict;
}
/// <summary>
/// 딕셔너리에서 키값으로 배열 가져오는 메서드
/// </summary>
/// <param name="dict"></param>
/// <param name="key"></param>
/// <returns></returns>
public string[] FindValuesByKey(Dictionary<string, string[]> dict, Enum key)
{
// Enum을 문자열로 변환합니다.
string keyString = key.ToString();
// 딕셔너리에서 키를 사용하여 값을 찾습니다.
string[] values;
if (dict.TryGetValue(keyString, out values))
{
// 값이 찾아졌다면, 그 값을 반환합니다.
return values;
}
else
{
// 키에 해당하는 값이 딕셔너리에 없다면, null을 반환합니다.
return null;
}
}
/// <summary>
/// 배열을 특정 키워드에 따라 잘라 키워드는 키값 나머지는 벨류값으로 나누기
/// </summary>
/// <param name="strings"></param>
/// <param name="enumName"></param>
public Dictionary<string, string[]> CSVSortationCutting(string[] strings, Type enumName)
{
// 결과를 저장할 딕셔너리를 생성합니다. 이 딕셔너리는 문자열을 키로, 문자열 배열을 값으로 가집니다.
Dictionary<string, string[]> dict = new Dictionary<string, string[]>();
// 문자열을 임시로 저장할 리스트를 생성합니다.
List<string> temp = new ();
string currentKey = null;
// 원본 배열의 모든 원소에 대해 반복합니다.
foreach (string s in strings)
{
// 현재 원소가 Enum 값 중 하나인지 판별합니다.
if (!Enum.IsDefined(enumName, s))
{
// Enum 값이 아니라면 임시 리스트에 추가합니다.
temp.Add(s);
}
else
{
// Enum 값이라면, 임시 리스트에 저장된 원소들을 새 배열로 만들어 딕셔너리에 추가합니다.
if (temp.Count > 0 && currentKey != null)
{
dict[currentKey] = temp.ToArray();
temp.Clear();
}
// 현재 원소를 새로운 키로 설정합니다.
currentKey = s;
}
}
// 마지막으로 임시 리스트에 남아 있는 원소들을 새 배열로 만들어 딕셔너리에 추가합니다.
if (temp.Count > 0 && currentKey != null)
{
dict[currentKey] = temp.ToArray();
}
return dict;
}
This post is licensed under CC BY 4.0 by the author.