2026년 7월 4일 토요일

ini-parser 만들기.. C#

누겟에 있는 ini-parser가 리눅스환경에서 정상동작하지 않는다.

윈도우에 있는 ini파일이 개행이 \r\n이거니와.

리눅스쪽으로 복사가 되면서 더미 데이터가 들어가는것 같다..

그래서 ini-parser를 쓰면 정상적으로 쪼개기가 안된다.

짜증나니까.. 나만의 ini-parser (읽기전용)을 만들었드랬다..





Public class MyIniParser
{
/// <summary>
/// 내부 자료
/// </summary>
private Dictionary<string, List<KeyValuePair<string, string>>> _iniData = new Dictionary<string, List<KeyValuePair<string, string>>>();


/// <summary>
/// 데이터 가져오기
/// </summary>
public T GetIniData<T>(string section, string key)
{
T ret_data = default;
if (!_iniData.ContainsKey(section)) { return ret_data; }
if (!_iniData[section].Exists(x => x.Key == key)) { return ret_data; }
KeyValuePair<string, string> ini_data = _iniData[section].Find(x => x.Key == key);
//
try
{
return (T)Convert.ChangeType(ini_data.Value, typeof(T));
}
catch
{
return ret_data;
}
}


/// <summary>
/// 파일경로로 파싱처리하기
/// </summary>
public bool ParseIniFile(string iniFile, Encoding encoding)
{
try
{
if (!File.Exists(iniFile)) { return false; }
string rawContent = File.ReadAllText(iniFile, encoding);

// ini를 읽기 좋게 변환처리
string result = rawContent.Replace("\r", "");
string[] lines = result.Split('\n');
var validLines = new List<string>();
foreach (string line in lines)
{
string trimmed = line.Trim();

// 빈라인 무시
if (string.IsNullOrWhiteSpace(trimmed)) continue;
// 주석으로 시작하는 라인제거 (';' 또는 '#')
if (trimmed.StartsWith(";") || trimmed.StartsWith("#")) continue;
// 깨진문자열 제외
if (trimmed.Contains("M-lM")) continue;
//
bool isSection = trimmed.StartsWith("[") && trimmed.EndsWith("]");
bool isKeyValue = trimmed.Contains("=");
if (isSection || isKeyValue) { validLines.Add(trimmed); }
}


//필터링된 라인으로 KeyValue 삽입
string lastSection = "";
foreach (string one_line in validLines)
{
bool isSection = one_line.StartsWith("[") && one_line.EndsWith("]");
bool isKeyValue = one_line.Contains("=");
//
if (isSection)
{
string sectionName = one_line.Substring(1, one_line.Length - 2);
lastSection = sectionName;
if (!_iniData.ContainsKey(sectionName))
{
_iniData.Add(sectionName, new List<KeyValuePair<string, string>>());
}
}
else if (isKeyValue)
{
string[] keyValue = one_line.Split('=');
if (keyValue.Length != 2) { continue; }
string key = keyValue[0].Trim();
string value = keyValue[1].Trim();
if (_iniData.ContainsKey(lastSection))
{
//동일한 키가 있으면 제거하고 새로 추가
var list = _iniData[lastSection];
int index = list.FindIndex(x => x.Key == key);
if (index != -1) { list.RemoveAt(index); }
//
_iniData[lastSection].Add(new KeyValuePair<string, string>(key, value));
}
}
}

//
return true;
} catch (Exception ex) {
throw ex;
}
}
}

댓글 없음:

댓글 쓰기