在Visual C#2008中解析tnsnames.ora

我如何使用Visual C#(Visual Studio 2008 Express版)解析tnsnames.ora文件以获取tnsnames? 例如,我的tnsnames.ora文件包含

ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = shaman)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) BILL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.58)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) 

如何解析此文件以获取TNSNAMES(即ORCL,BILL等)。 原谅我,如果这个问题听起来太明显了,我正在学习并尝试用C#

首先,您需要此文件的语法规则 。

这可能是一个hack,但我个人会使用完整的解析器,如ANTLR结合正确的语法 ( 可以在这里找到完整的ANTLR语法列表)。

 public List ReadTextFile(string FP) { string inputString; List List = new List(); try { StreamReader streamReader = File.OpenText(FP.Trim()); // FP is the filepath of TNS file inputString = streamReader.ReadToEnd(); string[] temp = inputString.Split(new string[] {Environment.NewLine},StringSplitOptions.None); for (int i = 0; i < temp.Length ;i++ ) { if (temp[i].Trim(' ', '(').Contains("DESCRIPTION")) { string DS = temp[i-1].Trim('=', ' '); List.Add(DS); } } streamReader.Close(); } catch (Exception EX) { } return List; } 

连同Sathya提供的那些,创建一个方法:

 StringBuilder strTns = new StringBuilder (); foreach ( var fileLine in System.IO.File.ReadAllLines(fiTNS.FullName ) ) { if ( (fileLine.Length > 0 && fileLine.Trim().Substring(0,1) != "#" ) && ( fileLine.Length > 0 && fileLine.Trim ().Substring (0,1) != "/" ) ) { strTns.AppendFormat("{0}{1}", fileLine, Environment.NewLine); } } //TNSNamesValues = System.IO.File.ReadAllText (fiTNS.FullName).ToString ().Replace ("\n", "" ).Replace ("\r", ""); String[] splitSeparator = LoadTNSNames (OracleHomeRegistryKey).ToArray (); String[] TNS = strTns.ToString().Split (splitSeparator, StringSplitOptions.None);