SQL_FMT] 요소들을 분해!!
망한 케이스
쿼리를 처음 정해놓은 keyword 목록으로 .Replace( ) 를 이용해서 치환하는 방법으로
"\r\n" + " " + keyword + " " + "\r\n"
위 같은 방법으로 여러 형태를 만들어서 각 요소들을 분리해냈었다.
결국엔 실패.. * <-- 을 바꿀때 이상한 동작으로 무한루프를 돈다거나 원하는데로 분리가 안되었다.
또는 '문자열 문자열... ' 싱글 쿼테이션을 만났을때 ...;;; 공백을 다 짤라먹든가 문장인데 잘려 나갔다.
그래서 우선 쪼개진걸로 계속 개발을 진행하다가 바꾸었다.
성공한 케이스
각 char을 차례로 지나가면서 공백을 만나거나 특정 문자열들을 만났을때 문자열을 걸러내는 작업을 했다.
ex) select 'aa bb', ' 랄 ''가나'' 라'
이런 쿼리를 샘플로 만들어서
아래 Parser 를 돌리면
"select"
"'aa bb'"
"' 랄 ''가나'' 라'
세 묶음으로 분리되어진다.
쿼리를 분리하기위해 좀더 손봤다. 주석문을 건너뛰는 동작으로 대상 쿼리요소를 제외시키는 방법을 썼다.
private List<string> Parser(string txt)
{
string content = txt.Trim().Replace(Environment.NewLine, " ");
List<string> lst = new List<string>();
List<char> chr = new List<char>();
char old = '\0';
int cnt = 0;
// 양사이드 빼고!!
for (int loop = 0; loop < content.Length; loop++)
{
char ch = content[loop];
char nch = '\0';
if (loop + 1 < content.Length)
{
nch = content[loop + 1];
}
if (ch == '\'')
{
cnt++;
chr.Add(ch);
if (nch == '\'')
{
cnt++;
chr.Add(nch); loop++;
}
if (cnt % 2 == 0)
{
lst.Add(string.Join("", chr.ToArray()).Trim());
chr.Clear();
cnt = 0;
}
continue;
}
else if( cnt > 0)
{
chr.Add(ch);
continue;
}
if (ch == ' ' && old != ch)
{
chr.Add(ch);
lst.Add(string.Join("", chr.ToArray()).Trim());
chr.Clear();
}
else if (ch == '(' && nch == ')')
{
chr.Add(ch);
lst.Add(string.Join("", chr.ToArray()).Trim());
chr.Clear();
}
else if (ch == ',')
{
lst.Add(string.Join("", chr.ToArray()).Trim());
chr.Clear();
chr.Add(ch);
lst.Add(string.Join("", chr.ToArray()).Trim());
chr.Clear();
}
else if (ch == '(' || ch == ')')
{
lst.Add(string.Join("", chr.ToArray()).Trim());
chr.Clear();
chr.Add(ch);
lst.Add(string.Join("", chr.ToArray()).Trim());
chr.Clear();
}
else
{
chr.Add(ch);
}
old = ch;
}
if( chr.Count > 0)
lst.Add(string.Join("", chr.ToArray()).Trim());
return lst;
}
'# 9) My Program(.NET)' 카테고리의 다른 글
작업이력관리툴 ~!!] 수정 (3) | 2015.10.10 |
---|---|
PGMMNG] DataGrid 소스 제너레이터? (0) | 2015.10.01 |
SQL_FMT] 새로 만들어진... (0) | 2015.09.08 |
SQL_FMT] 새로 다시 만드는 쿼리 포멧터 (0) | 2015.08.19 |
쿼리포맷터 III (2) | 2015.05.24 |