如何使用某种命名约定解析所有唯一变量?

时间:2015-12-17 16:09:35

标签: c#

我有一个代码文件,我需要找到TADODataSet类型的所有唯一对象,但它们并没有在我拥有的这个30,000行文件中定义。

我编写了一个控制台应用程序,它将每一行拆分为单个单词,如果它包含ADODataSet(我感兴趣的对象的命名约定前缀),则将该单词添加到列表中,但这并不是&#因为我如何分割我的代码行,所以工作得很好。

这是我的所有代码:

    static void Main(string[] args)
    {
        string file = @"C:\somePath\Form1.cs";
        string output = @"C:\someOtherPath\New Text Document.txt";
        List<string> datasets = new List<string>();
        string[] lines = File.ReadAllLines(file);

        foreach (string line in lines)
        {
            string[] words = line.Split(' ');

            foreach (string word in words)
            {
                if (word.ToLower().Contains("adodataset"))
                    datasets.Add(word);
            }
        }

        if (datasets.Count > 0)
        {
            using (StreamWriter sw = new StreamWriter(output))
            {   
                foreach (string dataset in datasets.Distinct())
                {
                    sw.WriteLine(dataset);
                }
            }

            Console.WriteLine(String.Format("Wrote {0} data sets to {1}", datasets.Distinct().Count(), output));
            Console.ReadKey();
        }
    }

但是这并没有像我希望的那样奏效,并且添加了#34;&#34;比如这些:

SQLText(ADODataSetEnrollment->FieldByName("Age1")->AsString)
SQLText(ADODataSetEnrollment->FieldByName("Age2")->AsString)
SQLText(ADODataSetEnrollment->FieldByName("Age3")->AsString)

我只对ADODataSetEnrollment感兴趣,所以我的输出文件中只有1个该变量的条目,但因为该行代码不包含空格所以被视为单个&#34;字&#34;。

如何拆分我的lines数组,这样我才能找到唯一的变量?

3 个答案:

答案 0 :(得分:1)

您是否尝试过RegEx匹配?使用RegEx,您可以举例说 RegEx.IsMatch(word, "(?i)(?<!\w)adodataset(?!\w)")

> (?i) means ignore case (like uppercase, lower case, i think) 
> (?<!\w)means not preceded by a literal (like letters, ABC..., abc... and so
> forth) 
> (?!\w) means not followed by a literal RegEx.IsMatch(...)
> returns a bool value

答案 1 :(得分:0)

结束这个作为解决方案:

string file = @"C:\somePath\Form1.cs";
string output = @"C:\someOtherPath\New Text Document.txt";
List<string> datasets = new List<string>();
string[] lines = File.ReadAllLines(file);
decimal i = 0;
foreach (string line in lines)
{
    string[] words = line.Split(' ');

    foreach (string word in words)
    {
        if (word.ToLower().Contains("adodataset"))
        {
            int start = word.ToLower().IndexOf("adodataset");
            string dsWord = String.Empty;
            string temp = word.Substring(start, word.Length - start);

            foreach (char c in temp)
            {
                if (Char.IsLetter(c))
                    dsWord += c;
                else
                    break;
            }

            if (dsWord != String.Empty)
                datasets.Add(dsWord);
        }
    }

    i++;
    Console.Write("\r{0}%      ", Math.Round(i / lines.Count() * 100, 2));
}

if (datasets.Count > 0)
{
    using (StreamWriter sw = new StreamWriter(output))
    {   
        foreach (string dataset in datasets.Distinct())
            sw.WriteLine(dataset);
    }

    Console.WriteLine(String.Format("Wrote {0} data sets to {1}", datasets.Distinct().Count(), output));
    Console.ReadKey();
}

漂亮的贫民区,但它做了我需要做的事情。如果他们知道使用Regex从代码行中提取变量名称的更好方法,而不是整行本身,我会高兴地接受别人的答案。

答案 2 :(得分:0)

您可以尝试此解决方案:

string file = File.ReadAllText(@"text.txt");
string output = @"C:\someOtherPath\New Text Document.txt";
List<string> datasets = new List<string>();
var a = Regex.Matches(file, @"\W(ADODataSet\w*)", RegexOptions.IgnoreCase);
foreach (Match m in a)
{
    datasets.Add(m.Groups[1].Value);
}