4

Visual C# (Visual Studio 2008 Express edition) を使用して 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# を学んで試しています。

4

4 に答える 4

4

まず、このファイルの構文規則が必要になります。

これにはおそらくハックがありますが、私は個人的に、適切な文法と組み合わせたANTLRのような完全なパーサーを使用します(ANTLR文法の完全なリストはここにあります)。

于 2009-08-07T06:10:06.967 に答える
1
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;

}
于 2011-11-29T07:30:10.647 に答える
0

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);
于 2010-12-27T15:44:33.833 に答える