2016-12-29 3 views
-2

Я хочу прочитать два файла: файл .c, а другой файл .csv. Теперь у .csv есть список ключевых слов C. Я хочу сопоставить эти ключевые слова C с программой .c и выбрать только ключевые слова и отобразить на консоли.Как использовать функцию Regular expression и Intersect для разделения ключевых слов из файла

Возможно, это простая задача, но я ее не понимаю.

В приведенном ниже коде я могу получить все буквы в массиве символов, но теперь это одна строка, чтобы сопоставить их с конкретными словами и выбирать только те слова из строки. Есть ли другой путь.

class FileReader 
{ 
    static void Main(string[] args) 
    { 
     string[] cprglines = File.ReadAllLines("E:\\cprogram\\cpro\\fact.c"); 
     string[] ckeywordslines = File.ReadAllLines("E:\\ckeywords.csv"); 

     string letters = string.Empty; 
     List<string> list = new List<string>(); 

     foreach (string a in cprglines) 
     { 
      foreach (char c in a) 
      { 
       if (Char.IsLetter(c)) 
       { 
        letters += c; 
       } 
      } 

      list.Add(letters); 
     } 

     string[] arr = list.ToArray(); 

     foreach (string a1 in arr) 
     { 
      Console.WriteLine(a1); 
     } 

     Console.ReadKey(); 
    } 
} 
+0

Непонятно, что вы пытаетесь достичь, не могли бы вы быть более ясными? о требованиях, а также о том, каков ожидаемый результат. –

+0

. Вы хотите прочитать файл и прочитать все слова, соответствующие определенным словам. Это то, что вы хотите? – Seminda

+0

да. Предположим, что моя программа имеет этот оператор void main(), поэтому я просто хочу void и main –

ответ

2

Если я правильно понял ваш вопрос. Это может сделать трюк для вас

string contentinc = @"#include <stdio.h> int main() {  int number;  printf('Enter an integer: ');  scanf('%d', &number); // True if the number is perfectly divisible by 2 if(number % 2 == 0)  printf('%d is even.', number); else  printf('%d is odd.', number); return 0;}"; 
string contectincsv = "include, main, number, there are, some thing, scanf, true"; 
contentinc = Regex.Replace(contentinc, @"[^0-9a-zA-Z ]+", " "); 
List<string> listofc = contentinc.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList(); 
List<string> listofcsv = contectincsv.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(p => p.Trim()).ToList(); 
List<string> Commonlist = listofcsv.Intersect(listofc).ToList(); 
+0

Intersect неявно возвращает только отдельные элементы, поэтому, например, printf будет отображаться только один раз в CommonList. Это может быть или не быть тем, что хочет OP – Martheen

+0

Dude u r genius. Этот код отлично работал, и вывод был точным, что я хотел. Спасибо тонну :) –

+0

Вы поняли, какой результат я хотел.Прежде всего, я был занят тем, что отдал мне минус очков и сказал, что мой пост дублирует и голосует за закрытие этого вопроса. Иногда мы не можем точно объяснить, что происходит в голове. –

0

Ваша ошибка здесь

foreach (string a in cprglines) 
     { 
      foreach (char c in a) 
      { 
       if (Char.IsLetter(c)) 
       { 
        letters += c; 
       } 
      } 

      list.Add(letters); 
     } 

Я не пишу код здесь, так как это занимает слишком много времени. Но я расскажу вам, как это написать.

  1. Разделить строку и получить отдельные слова
  2. Проверьте для каждого слова (), #, ;, -, +, / или %. Если да, удалите эти специальные символы.
  3. Теперь проверьте, есть ли это в списке ключевых слов C.
  4. Если он есть, добавьте его в свой список.
+1

Разделение строки для получения отдельных слов требует определения разделительных символов. Если символы определены как пробел и другие символы, шаг 1 и 2 можно выполнить за один вызов. – Martheen

+0

Да. хорошая точка зрения. – Prajwal

+0

Я пробовал это, но это не сработало для меня. –