using System.Collections.Generic; using System.IO; using System.Linq; namespace TestConsoleApp { public class QueryParser { public List Parse() { var totalQuery = File.ReadAllText(@"D:\testquery.txt"); return _Parse(totalQuery); } List _Parse(string actualQuery) { string columnString = GetColumnString(actualQuery); List resultColumnlist = new List(); var commaSeperatedArray = columnString.Split(','); for (int i = 0; i < commaSeperatedArray.Length; i++) { var column = commaSeperatedArray[i]; if (IsPredefinedFunction(column)) { if (!IsPerfectPredefinedFunction(column)) { column = MakeItPerfect(ref i, commaSeperatedArray, commaSeperatedArray[i]); } resultColumnlist.Add(column); } else { resultColumnlist.Add(column); } } return resultColumnlist; } string GetColumnString(string actualQuery) { actualQuery = actualQuery.Replace(System.Environment.NewLine, " "); var fromidex = actualQuery.ToLower().LastIndexOf("from "); var splitted = actualQuery.Substring(0, fromidex); splitted = splitted.TrimStart().Remove(0, "select".Length); return splitted; } bool IsPredefinedFunction(string name) { var _name = name.ToLower(); bool result = false; foreach (var function in PredefinedFunctions()) { if (_name.Contains(function.ToLower())) { result = true; break; } } return result; } string[] PredefinedFunctions() { return new string[] { "coalesce","concat","select","min","max","count" }; } bool IsPerfectPredefinedFunction(string name) { var opencount = name.Count(c => c == '('); var closecount = name.Count(c => c == ')'); return opencount == closecount; } string MakeItPerfect(ref int index, string[] colArray, string columnName) { index = index + 1; var column = columnName + "," + colArray[index]; if (!IsPerfectPredefinedFunction(column)) { column = MakeItPerfect(ref index, colArray, column); } return column; } } }