تحليل tnsnames.ora في Visual C # 2008
-
12-09-2019 - |
سؤال
كيف يمكنني تحليل ملف tnsnames.ora باستخدام Visual C # (Visual Studio 2008 Express Edition) للحصول على 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، فاتورة، إلخ). سامحني إذا كان هذا السؤال يبدو واضحا جدا، أتعلم ويحاول يدي في C #
المحلول
بادئ ذي بدء، سوف تحتاج قواعد بناء الجملة لهذا الملف.
ربما هناك اختراق لهذا، لكنني سأذهب شخصيا مع محلل كامل، مثل antlr. مدموج مع القواعد السليمة (قائمة كاملة من قواعد النهرات يمكن العثور عليها هنا).
نصائح أخرى
public List<string> ReadTextFile(string FP)
{
string inputString;
List<string> List = new List<string>();
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);
لا تنتمي إلى StackOverflow