[Homework] Streams and Files
Колеги имам въпрос по Problem{3} Word Count:
Как мога да си напрвя RegEx който да е case sensitive. Ни ми хващаше главните и малките букви като еднакви и затова ги обърнах всички на малки.
line = line.ToLower();
words[i] = words[i].ToLower();
Където words[i] ми е дума от файла words.txt, а line ми е ред прочетен от файла text.txt. Но това все още не ми решава проблема с - пред думите. в смисъл is и -Is за RegEx не са едно и също нещо. Pattern-а ми е:
string pattern = @"\b" + words[i] + @"\b";
какво да му добавя за да не взема тия тирета за част от думата?
А какво става ако във файла words.txt имаш по повече от една дума на ред?
Доколкото виждам ти четеш целия ред и в конкретния пример ще работи, но ако думите са една до друга разделени с интервал или с точки примерно ще работи ли? Аз мисля, че няма.
Write a program that reads a list of words from the file words.txt and finds how many times each of the words is contained in another file
text.txt.
Matching should be case - insensitive.
ами няма да работи то в условието никъде не е казано, да се съобразим с различно разделение на думите и аз се водя от него.
Aма не и казано, че трябва да са по една дума на един ред. Аз за това исках да го направя да работи и ако си е нормален текстов файл, но нещо се омазаха нещата. Е ако не стане може и аз така да го направя ред по ред.
Другото което ми хрумва е да прочета целия файл words.txt да си го запиша в един стринг. И след това да си го разбия на масив от стингове по разделител интервал . - ! ? и нов ред. И тогава да проверявам със всеки един елемент на масива с RegEx дали го има в text.txt, но ми се струва, че ако файла е по-голям и искам да го прочета на веднъж доста ще се озори програмата.
Аз съм го направил така целия текст е в един стринг и го проверявам за всяка дума по отделно като броя колко пъти се среща, не виждам проблем защото това е текстов файл, все пак ти няма да проверяваш файл с размер 1 гб.
ще го помъча още но утре
то и сега брои, но не брои правилно нали уж IgnoreCase трябва да премахва тия разлики от малки големи букви и т.н, а то май не е точно така. Това fault например не иска да ми го преброи, а го има в текста просто има една . накрая
StreamReader чете ред след ред. Защо просто на всеки ред не прилагате регекс, който хваща всички думи без точки, запетаи, и т.н., прилагате им .ToLower(), и ги пращате в един лист. Като приключи действието си, reader-a ще е минал целия файл, без значение колко редове са, вие ще имате всички думи в един лист и тези думи ще можете да ги правите каквото си искате.
Eто един пример
1. Чета файла, отделям думите.
2. Чета втория файл, за всяка от думите в него слагам по един запис в асоциативен масив, който ми пази колко пъти се среща.
3. Сортирам и записвам в трети файл.
Задачатая тръгна и то без да използвам Регулярен израз.
Ето го крайният вариан, който дава верен резултат:
http://pastebin.com/eu8S3u4K