2014-01-29 4 views
0

У меня есть список слов. Я хочу, чтобы программа сканировала несколько слов из текстового файла.Сканировать несколько слов из текстового файла

Это то, что у меня уже есть:

int counter = 0; 
     string line; 
     StringBuilder sb = new StringBuilder(); 

     string[] words = { "var", "bob", "for", "example"}; 

     try 
     { 
      using (StreamReader file = new StreamReader("test.txt")) 
      { 
       while ((line = file.ReadLine()) != null) 
       { 
        if (line.Contains(Convert.ToChar(words))) 
        { 
         sb.AppendLine(line.ToString()); 
        } 
       } 
      } 

      listResults.Text += sb.ToString(); 
     } 
     catch (Exception ex) 
     { 
      listResults.ForeColor = Color.Red; 
      listResults.Text = "---ERROR---"; 
     } 

Так я хочу, чтобы проверить файл на слово, а если нет, сканирование для следующего слова ...

+0

Дубликат [Использование C#, чтобы проверить, если строка содержит строку в массив строк] (http://stackoverflow.com/questions/2912476/using-c-sharp-to-check- если строка содержит-A-строку-в-строку массива). – CodeCaster

+0

Зависит от того, как файл выложен. Разделяются ли слова символами новой строки, пробелами, другим разделителем? – itsme86

ответ

2

String.Contains() только принимает один аргумент: строка. То, что делает ваш звонок на Contains(Convert.ToChar(words)), вероятно, не то, что вы ожидаете.

Как объяснен в Using C# to check if string contains a string in string array, вы можете захотеть сделать что-то вроде этого:

using (StreamReader file = new StreamReader("test.txt")) 
{ 
    while ((line = file.ReadLine()) != null) 
    { 
     foreach (string word in words) 
     { 
      if (line.Contains(word)) 
      { 
       sb.AppendLine(line); 
      } 
     } 
    } 
} 

Или, если вы хотите следовать точной постановке задачи («просканировать файл слово, и если его нет , сканирование для следующего слова»), вы можете захотеть взглянуть на Return StreamReader to Beginning:

using (StreamReader file = new StreamReader("test.txt")) 
{ 
    foreach (string word in words) 
    { 
     while ((line = file.ReadLine()) != null) 
     { 
      if (line.Contains(word)) 
      { 
       sb.AppendLine(line); 
      } 
     } 

     if (sb.Length == 0) 
     { 
      // Rewind file to prepare for next word 
      file.Position = 0; 
      file.DiscardBufferedData(); 
     } 
     else 
     { 
      return sb.ToString(); 
     } 
    } 
} 

Но это будет думать,„боб“является частью„рысь“. Если вы не согласны, см String compare C# - whole word match и заменить:

line.Contains(word) 

с

string wordWithBoundaries = "\\b" + word + "\\b"; 
Regex.IsMatch(line, wordWithBoundaries); 
0
StringBuilder sb = new StringBuilder();    
string[] words = { "var", "bob", "for", "example" }; 
string[] file_lines = File.ReadAllLines("filepath"); 
for (int i = 0; i < file_lines.Length; i++)   
{             
    string[] split_words = file_lines[i].Split(' '); 
    foreach (string str in split_words)    
    {            
     foreach (string word in words)    
     {           
      if (str == word)       
      {          
       sb.AppendLine(file_lines[i]);  
      }          
     }           
    }            
}             
+0

Это крайне неэффективно, если файл, который читается, большой ... –

+0

Вы уверены, что каждые два слова отделены от другого на одно пространство? – CodeCaster

+0

Определенно нет. но если мы используем line.Contains(), он возвращает true, когда существует часть слова. например, «информация» содержит «для», – mnshahab

0

Это работает удовольствие:

var query = 
    from line in System.IO.File.ReadLines("test.txt") 
    where words.Any(word => line.Contains(word)) 
    select line; 

Чтобы получить эти, как один строка, просто сделайте это:

var results = String.Join(Environment.NewLine, query); 

Не может быть намного проще.


Если вы хотите совместить только целые слова, это становится немного сложнее. Вы можете сделать это:

Regex[] regexs = 
    words 
     .Select(word => new Regex(String.Format(@"\b{0}\b", Regex.Escape(word)))) 
     .ToArray(); 

var query = 
    from line in System.IO.File.ReadLines(fileName) 
    where regexs.Any(regex => regex.IsMatch(line)) 
    select line; 
Смежные вопросы