Парсинг текста - 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));
}
}
}