我有一个代码文件,我需要找到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
数组,这样我才能找到唯一的变量?
答案 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);
}