Парсинг текста - C# (191110)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте)))! Есть проблемка с парсингом текста. В общем есть класс Reader, он считывает строки из текстового файла(работает):
Листинг программы
  1. public class Reader
  2. {
  3. private string fileName;
  4. private string bufLine = string.Empty;
  5. public Reader(string fName)
  6. {
  7. this.fileName = fName;
  8. }
  9. public List<string> Read()
  10. {
  11. FileStream stream = new FileStream(fileName, FileMode.Open);
  12. StreamReader reader = new StreamReader(stream, Encoding.Default);
  13. List<string> result = new List<string>();
  14. string str = string.Empty;
  15. while (!reader.EndOfStream)
  16. {
  17. str = reader.ReadLine();
  18. result.Add(str.ToLower());
  19. //Word.LineNo++;
  20. }
  21. reader.Close();
  22. return result;
  23. }
  24. }
Есть класс Parser, который должен принять лист строк и распарсить каждое слово в класс Word, т.е. каждое слово обернуть в класс Word вместе с частотой его встреч в тексте и расположением в тексте, т.е. номера строк, в которых это слово встретилось. Сам Парсер я написал, но есть проблемка, которую не могу решить. Проблема с подсчетом количества слов и строк, в которых оно встретилось.
Листинг программы
  1. public class Parser
  2. {
  3. public List<Word> Parse(List<string> sentences)
  4. {
  5. string pattern = @"(\w+)";
  6. List<Word> listWord = new List<Word>();
  7. foreach (var currentSentence in sentences)
  8. {
  9. Word.LineNo++;
  10. var matches = Regex.Matches(currentSentence, pattern);
  11. foreach (Match match in matches)
  12. {
  13. var word = new Word(match.Value); //в этом вся проблема, я не знаю как по другому запихнуть результат поиска слова в класс Word.
  14. if (!listWord.Contains(word))
  15. {
  16. word.UpdateWordCount();
  17. listWord.Add(word);
  18. }
  19. else
  20. {
  21. word.UpdateWordCount();
  22. }
  23. }
  24. }
  25. return listWord;
  26. }
  27. }
Вот сам класс Word:
Листинг программы
  1. public class Word
  2. {
  3. public string Value { get; private set; }
  4. public int WordCount { get; private set; }
  5. public static int LineNo { get; set; }
  6. public int LastLineNo { get; private set; }
  7. public List<int> Lines;
  8. public Word(string value)
  9. {
  10. this.Value = value;
  11. Lines = new List<int>();
  12. }
  13.  
  14. public void UpdateWordCount()
  15. {
  16. WordCount++;
  17. if (WordCount == 1 || LastLineNo != LineNo)
  18. {
  19. Lines.Add(LineNo);
  20. LastLineNo = LineNo;
  21. }
  22. }
  23. public override string ToString()
  24. {
  25. return String.Format("{0}....... {1}: {2}", Value, WordCount, String.Join(" ", Lines));
  26. }
  27. }
Подкиньте, плиз, идейку, уже запарился с решением!!! Заранее благодарен!

Решение задачи: «Парсинг текста»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Windows.Forms;
  7.  
  8. namespace WindowsFormsApplication302
  9. {
  10.     public partial class Form1 : Form
  11.     {
  12.         public Form1()
  13.         {
  14.             InitializeComponent();
  15.  
  16.             var ofd = new OpenFileDialog();
  17.             if(ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  18.             {
  19.                 var dict = new Parser().Parse(File.ReadAllText(ofd.FileName, Encoding.Default));
  20.                 foreach (var w in dict.Values)
  21.                     Console.WriteLine(w);
  22.             }
  23.         }
  24.     }
  25.  
  26.     class Parser
  27.     {
  28.         public Dictionary<string, Word> Parse(string text)
  29.         {
  30.             var res = new Dictionary<string, Word>();
  31.             var iLine = 0;
  32.             foreach(var line in text.ToLower().Split(new char[]{'\n'}, StringSplitOptions.None))
  33.             {
  34.                 iLine++;
  35.                 foreach(Match m in Regex.Matches(line, @"\w+"))
  36.                 {
  37.                     var word = m.Value;
  38.                     Word w;
  39.                     if (!res.TryGetValue(word, out w))
  40.                         w = res[word] = new Word(word);
  41.                     w.Add(iLine);
  42.                 }
  43.             }
  44.  
  45.             return res;
  46.         }
  47.     }
  48.  
  49.     class Word
  50.     {
  51.         public string Value { get; private set; }
  52.         public int Count { get; private set; }
  53.         public HashSet<int> Lines = new HashSet<int>();
  54.  
  55.         public Word(string value)
  56.         {
  57.             this.Value = value;
  58.         }
  59.  
  60.         public void Add(int iLine)
  61.         {
  62.             Lines.Add(iLine);
  63.             Count++;
  64.         }
  65.        
  66.         public override string ToString()
  67.         {
  68.             return String.Format("{0}....... {1}: {2}", Value, Count, String.Join(" ", Lines));
  69.         }
  70.     }
  71. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут