퇴근5분전

 

 망한 케이스

 

쿼리를 처음 정해놓은 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;
        }