public void GenerateOFile(string leftFilePath, string rightFilePath, string ignoreCols, string keyCols, string outFilePath)
        {
            string leftFile = "";

            using (StreamReader sr = new StreamReader(leftFilePath, Encoding.UTF8))
            {
                leftFile = sr.ReadToEnd();
            }

            string rightFile = "";

            using (StreamReader sr = new StreamReader(rightFilePath, Encoding.UTF8))
            {
                rightFile = sr.ReadToEnd();
            }

            ResGroup resGroup1 = GenerateResGroup(leftFile);

            resGroup1.name = getNameAndKey(leftFilePath);
            ResGroup resGroup2 = GenerateResGroup(rightFile);

            resGroup2.name = getNameAndKey(rightFilePath);
            IgnoreList igList = GenerateIgnoreList(ignoreCols);

            // todo
            CompareGroup comGroup = CompareResult(resGroup1, resGroup2, igList, keyCols);
            string       outStr   = ConvertCompareGroup(comGroup);

            File.WriteAllText(outFilePath, outStr, Encoding.UTF8);
        }
        private string ConvertCompareGroup(CompareGroup comGroup)
        {
            int thick = comGroup.thick();

            string        colKeys      = "";
            List <string> vecKeyValue1 = new List <string>();
            List <string> vecKeyValue2 = new List <string>();

            string        columns   = "";
            List <string> vecValue1 = new List <string>();
            List <string> vecValue2 = new List <string>();

            for (int i = 0; i < thick; ++i)
            {
                vecKeyValue1.Add("");
                vecKeyValue2.Add("");
                vecValue1.Add("");
                vecValue2.Add("");
            }

            foreach (var it in comGroup.comKeys)
            {
                if (colKeys != "")
                {
                    colKeys += ",";
                }
                colKeys += fill(it.col, it.length());

                for (int i = 0; i < thick; ++i)
                {
                    if (vecKeyValue1[i] != "")
                    {
                        vecKeyValue1[i] += ",";
                    }
                    vecKeyValue1[i] += fill(it.vecStr1[i], it.length());

                    if (vecKeyValue2[i] != "")
                    {
                        vecKeyValue2[i] += ",";
                    }
                    vecKeyValue2[i] += fill(it.vecStr2[i], it.length());
                }
            }

            foreach (var it in comGroup.comUnits)
            {
                columns += fill(it.col, it.length());
                columns += ",";

                for (int i = 0; i < thick; ++i)
                {
                    vecValue1[i] += fill(it.vecStr1[i], it.length());
                    vecValue1[i] += ",";
                    vecValue2[i] += fill(it.vecStr2[i], it.length());
                    vecValue2[i] += ",";
                }
            }

            if (columns == "")
            {
                return("");
            }

            string str = colKeys + ";" + columns + "\r\n";

            for (int i = 0; i < vecValue1.Count; ++i)
            {
                str += vecKeyValue1[i] + ";" + vecValue1[i] + "\r\n";
                str += vecKeyValue2[i] + ";" + vecValue2[i] + "\r\n";
            }

            return(str);
        }
        private CompareGroup CompareResult(ResGroup rsGroup1, ResGroup rsGroup2, IgnoreList igList, string comKeys)
        {
            CompareGroup comGroup = new CompareGroup();

            if (!rsGroup1.isValid() || !rsGroup2.isValid())
            {
                throw new Exception("resGroup Invalid");
            }

            if (rsGroup1.size() != rsGroup2.size())
            {
                throw new Exception("res1 && res2 size Invalid");
            }

            int szOfGroup = rsGroup1.size();

            for (int i = 0; i < szOfGroup; ++i)
            {
                if (rsGroup1.columns[i] != rsGroup1.columns[i])
                {
                    throw new Exception("columns not matched.");
                }
            }

            if (rsGroup1.colValues.Count != rsGroup2.colValues.Count)
            {
                string exMsg = "record size not match," + rsGroup1.name + "=" + rsGroup1.colValues.Count.ToString() +
                               " is not equal to " + rsGroup2.name + "=" + rsGroup2.colValues.Count.ToString();
                throw new Exception(exMsg);
            }

            List <string> keys = comKeys.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();

            for (int i = 0; i < rsGroup1.colValues.Count; ++i)
            {
                for (int j = 0; j < szOfGroup; ++j)
                {
                    if (comKeys != "")
                    {
                        foreach (var it in keys)
                        {
                            if (it == rsGroup1.columns[j])
                            {
                                CompareUnit ck = comGroup.getColKey(it);
                                if (ck == null)
                                {
                                    ck = new CompareUnit(it);
                                    comGroup.comKeys.Add(ck);
                                }

                                ck.vecStr1[i] = rsGroup1.colValues[i][j];
                                ck.vecStr2[i] = rsGroup2.colValues[i][j];
                            }
                        }
                    }

                    if (rsGroup1.colValues[i][j] == rsGroup2.colValues[i][j])
                    {
                        continue;
                    }

                    if (igList.HasValue(rsGroup1.columns[j]) &&
                        rsGroup1.colValues[i][j] != "" &&
                        rsGroup2.colValues[i][j] != "")
                    {
                        continue;
                    }

                    CompareUnit cu = comGroup.getColUnit(rsGroup1.columns[j]);
                    if (cu == null)
                    {
                        cu = new CompareUnit(rsGroup1.columns[j]);
                        comGroup.comUnits.Add(cu);
                    }

                    cu.vecStr1[i] = rsGroup1.colValues[i][j];
                    cu.vecStr2[i] = rsGroup2.colValues[i][j];
                }
            }

            return(comGroup);
        }