Парсинг текста - C# (191110)
Формулировка задачи:
Здравствуйте)))!
Есть проблемка с парсингом текста. В общем есть класс Reader, он считывает строки из текстового файла(работает):
Есть класс Parser, который должен принять лист строк и распарсить каждое слово в класс Word, т.е. каждое слово обернуть в класс Word вместе с частотой его встреч в тексте и расположением в тексте, т.е. номера строк, в которых это слово встретилось.
Сам Парсер я написал, но есть проблемка, которую не могу решить. Проблема с подсчетом количества слов и строк, в которых оно встретилось.
Вот сам класс Word:
Подкиньте, плиз, идейку, уже запарился с решением!!!
Заранее благодарен!
Листинг программы
- 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;
- }
- }
Листинг программы
- 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;
- }
- }
Листинг программы
- 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));
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д