Разбор файла в С#

У меня есть файл tnsnames.ora, который включает более 50 псевдонимов. Добавлен пример содержания ниже.

В настоящее время я использую приведенный ниже код для получения псевдонимов от tns;

tnsnamesreadercustom tsc = new tnsnamesreadercustom();
uceTNS.DataSource = tsc.LoadTNSNames(FilePath);

И я успешно разбираю эти псевдонимы tnsnames в поле со списком, например ;

NAME1
NAME2
NAME3

Но я не смог закончить последний шаг, который есть;

Пользователь выбирает вышеуказанные псевдонимы, например ИМЯ1, и он должен получить подробную информацию в окне сообщений, например;

HOST:name1.local.com
PORT:1521
SERVICE_NAME:nameone
SID=null

Вот пример tnsnames.ora;

NAME1=
  (DESCRIPTION=
    (ADDRESS=
      (PROTOCOL=TCP)
      (HOST=name1.local.com)
      (PORT=1521)
    )
    (CONNECT_DATA=
      (SERVER=dedicated)
      (SERVICE_NAME=nameone)
    )
  )

NAME2= 
  (DESCRIPTION= 
    (ADDRESS= 
      (PROTOCOL=TCP) 
      (HOST=172.31.60.227) 
      (PORT=1531) 
    ) 
    (CONNECT_DATA= 
      (SERVER=dedicated) 
      (SID=nametwo) 
    ) 
  ) 

NAME3= 
  (DESCRIPTION= 
    (ADDRESS= 
      (PROTOCOL=TCP) 
      (HOST=172.31.70.174) 
      (PORT=1521) 
    ) 
    (CONNECT_DATA= 
      (SERVER=dedicated) 
      (SERVICE_NAME=namethree) 
    ) 
  )

Вот tnsnamesreadercustom;

   class tnsnamesreadercustom
    {
        public List<string> LoadTNSNames(string strTNSNAMESORAFilePath)
        {
            List<string> DBNamesCollection = new List<string>();
            string RegExPattern = @"[\n][\s]*[^\(][a-zA-Z0-9_.]+[\s]*=[\s]*\(";

            if (!strTNSNAMESORAFilePath.Equals(""))
            {
                //check out that file does physically exists
                System.IO.FileInfo fiTNS = new System.IO.FileInfo(strTNSNAMESORAFilePath);
                if (fiTNS.Exists)
                {
                    if (fiTNS.Length > 0)
                    {
                        //read tnsnames.ora file
                        int iCount;
                        for (iCount = 0; iCount < Regex.Matches(System.IO.File.ReadAllText(fiTNS.FullName), RegExPattern).Count; iCount++)
                        {
                            DBNamesCollection.Add(Regex.Matches(System.IO.File.ReadAllText(fiTNS.FullName), RegExPattern)[iCount].Value.Trim().Substring(0, Regex.Matches(System.IO.File.ReadAllText(fiTNS.FullName), RegExPattern)[iCount].Value.Replace("=", " ").Trim().IndexOf(" ")).Replace(" ", "").Replace("=", "").Replace(Environment.NewLine, ""));
                        }
                    }
                }
            }
            return DBNamesCollection;
        }
    }

person john true    schedule 16.11.2018    source источник
comment
Что такое tnsnamesreadercustom? Может помочь, если вы разместили код.   -  person John Wu    schedule 16.11.2018
comment
@ ну, это просто регулярное выражение псевдонимов, которыми я только что поделился   -  person john true    schedule 16.11.2018
comment
Вы пробовали это решение?   -  person Dean    schedule 16.11.2018
comment
@Dean Они анализируют псевдонимы, а не параметры.   -  person john true    schedule 16.11.2018
comment
Я также нашел это, что может помочь: codeproject.com/Tips/224853/.   -  person Polyfun    schedule 16.11.2018
comment
@Polyfun Спасибо, но я не использую Oracle.DataAccess.Client. Я попробовал это около 2 дней назад. но не повезло.   -  person john true    schedule 16.11.2018
comment
Этот проект также выглядит полезным и доступен как Пакет NuGet. Я не уверен, что понимаю вашу точку зрения о псевдонимах и параметрах. Связанная с ANTLR грамматика выглядит так, будто она наверняка поддерживает параметры.   -  person Dean    schedule 16.11.2018
comment
это похоже на файл TNSNAMES.ora. Вы смотрели на это? stackoverflow.com/questions/3549863   -  person Hanjun Chen    schedule 16.11.2018
comment
Примечание, не связанное с вопросом: почему вы постоянно читаете файл (strTNSNAMESORAFilePath) снова, снова и снова (System.IO.File.ReadAllText)? Почему вы не прочитали его только один раз в строковую переменную, а затем использовали строковую переменную? И почему вы снова и снова выполняете сопоставление одного и того же шаблона регулярного выражения с одной и той же строкой (содержимым файла) вместо того, чтобы делать это только один раз, а затем использовать полученную коллекцию MatchCollection? Мало того, что это плохо с точки зрения производительности (вероятно, не имеет значения), но это также является ненужным дублированием кода с читаемостью кода, выходящей из окна...   -  person    schedule 16.11.2018