Парсинг текста - 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)); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д