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

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

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

Здравствуйте)))! Есть проблемка с парсингом текста. В общем есть класс Reader, он считывает строки из текстового файла(работает):
public class Reader
    {
        private string fileName;
        private string bufLine = string.Empty;
 
        public Reader(string fName)
        {
            this.fileName = fName;
        }
 
        public List<string> Read()
        {
            FileStream stream = new FileStream(fileName, FileMode.Open);
            StreamReader reader = new StreamReader(stream, Encoding.Default);
            List<string> result = new List<string>();
 
            string str = string.Empty;
            while (!reader.EndOfStream)
            {
                str = reader.ReadLine();
                result.Add(str.ToLower());
                //Word.LineNo++;
            }
            reader.Close();
            return result;
        }
    }
Есть класс Parser, который должен принять лист строк и распарсить каждое слово в класс Word, т.е. каждое слово обернуть в класс Word вместе с частотой его встреч в тексте и расположением в тексте, т.е. номера строк, в которых это слово встретилось. Сам Парсер я написал, но есть проблемка, которую не могу решить. Проблема с подсчетом количества слов и строк, в которых оно встретилось.
public class Parser
    {
        public List<Word> Parse(List<string> sentences)
        {
            string pattern = @"(\w+)";
            List<Word> listWord = new List<Word>();
            foreach (var currentSentence in sentences)
            {
                Word.LineNo++;
                
                var matches = Regex.Matches(currentSentence, pattern);
                foreach (Match match in matches)
                {
                    var word = new Word(match.Value); //в этом вся проблема, я не знаю как по другому запихнуть результат поиска слова в класс Word. 
                                       
                    if (!listWord.Contains(word))
                    {
                        word.UpdateWordCount();
                        listWord.Add(word);
                    }
                    else
                    {
                        word.UpdateWordCount();
                    }
                    
                }
            }
            return listWord;
            
        }
    }
Вот сам класс Word:
public class Word
    {
        public string Value { get; private set; }
        public int WordCount { get; private set; }
        public static int LineNo { get; set; }
        public int LastLineNo { get; private set; }
        public List<int> Lines;
 
        public Word(string value)
        {
            this.Value = value;
            Lines = new List<int>();
        }

        public void UpdateWordCount()
        {
            WordCount++;
            if (WordCount == 1 || LastLineNo != LineNo)
            {
                Lines.Add(LineNo);
                LastLineNo = LineNo;
            }
        
        }
 
        public override string ToString()
        {
            return String.Format("{0}....... {1}: {2}", Value, WordCount, String.Join(" ", Lines));
        }
 
    }
Подкиньте, плиз, идейку, уже запарился с решением!!! Заранее благодарен!

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

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
 
namespace WindowsFormsApplication302
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            var ofd = new OpenFileDialog();
            if(ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                var dict = new Parser().Parse(File.ReadAllText(ofd.FileName, Encoding.Default));
                foreach (var w in dict.Values)
                    Console.WriteLine(w);
            }
        }
    }
 
    class Parser
    {
        public Dictionary<string, Word> Parse(string text)
        {
            var res = new Dictionary<string, Word>();
            var iLine = 0;
            foreach(var line in text.ToLower().Split(new char[]{'\n'}, StringSplitOptions.None))
            {
                iLine++;
                foreach(Match m in Regex.Matches(line, @"\w+"))
                {
                    var word = m.Value;
                    Word w;
                    if (!res.TryGetValue(word, out w))
                        w = res[word] = new Word(word);
                    w.Add(iLine);
                }
            }
 
            return res;
        }
    }
 
    class Word
    {
        public string Value { get; private set; }
        public int Count { get; private set; }
        public HashSet<int> Lines = new HashSet<int>();
 
        public Word(string value)
        {
            this.Value = value;
        }
 
        public void Add(int iLine)
        {
            Lines.Add(iLine);
            Count++;
        }
        
        public override string ToString()
        {
            return String.Format("{0}....... {1}: {2}", Value, Count, String.Join(" ", Lines));
        }
    }
}

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


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

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

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