PHP Homework 7
Домашно № 7 – от курса по PHP в Telerik
Както беше условието на домашното – надградил съм старата система като съм добавил система за регистрация, страница users.php и books.php.
Няма да изпадам в разяснения на кода, понеже почти всичко е по заданието – така че ако има нещо неясно или някаква критика към кода – пишете в коментарите:
C#2 (CSharp) 07-TextFiles
Здравейте,
От доста време не бях поствал нещо свързано с академията, но това е не защото не ми се занимава, ами просто материята във втората част на CSharp е доста по-трудна и бях малко назад с материала.
Но тази тема специално се оказа доста приятна и за това ще пусна кода с кратко обяснение за всяка задача:
01. Напишете програма която чете от текстов файл и принтира всички четни редове на конзолата.
Обяснение: Опитваме да заредим файла със StreamReader като сме го поставили във using поле, за да сме сигурни, че стриима ще се затвори след прочитане на файла.
Въртим един while цикъл и като условие за цикъла поставяме – докато имаме редове които не са null. Тоест цикъла се върти докато имаме редове в файла.
След това правим проверка на променливата lineCounter, която се увеличава с единица на всеки нов ред, дали е четна или не. Ако е четна – печатаме реда.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// 01. Write a program that reads a text file and prints on the console its odd lines. using System; using System.IO; class OddLines { static void Main() { using (StreamReader reader = new StreamReader("../../file.txt")) { string line; int lineCounter = 1; while ((line = reader.ReadLine()) != null) { if (lineCounter % 2 != 0) { Console.WriteLine(line); } lineCounter++; } } } } |
02. Напишете програма която свързва два текстови файла в трети общ файл.
Обяснение: Първо прочитаме съдържанието и на двата файла и го записваме в две променливи firstFile и secondFile, след това с помощта на StreamWriter записваме двата файла в нов файл combine.txt като добавяме нов ред между тях с помощта на Enviroment.NewLine. Хубаво е да слагате нов ред с Enviroment.NewLine понеже това е универсален клас който работи за всички операционни системи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 02. Write a program that concatenates two text files into another text file. using System; using System.IO; class ConcatenateTextFiles { static void Main() { string firstFile = File.ReadAllText("../../barbarians.txt"); string secondFile = File.ReadAllText("../../wizards.txt"); using (StreamWriter writer = File.CreateText("../../combine.txt")) { writer.Write(firstFile + Environment.NewLine + secondFile); Console.WriteLine("The combined file was created!"); } } } |
03. Напишете програма която прочита текстови файл и добавя номера на реда пред всеки ред. Резултата трябва да се запише в нов файл.
Обяснение: Зареждаме файла с StreamReader и въртим цикъл докато имаме редове. При всяко завъртане конкатенираме текущия ред с една нарастваща променлива lineCounter. Записваме резултата в новия файл с помощта на StreamWriter.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 03. Write a program that reads a text file and inserts line numbers // in front of each of its lines. The result should be written to another text file. using System; using System.IO; class LineNumbers { static void Main() { using (StreamReader reader = new StreamReader("../../LandOfConfusion.txt")) { using(StreamWriter writer = new StreamWriter("../../SongWithLineNumbers.txt")) { string line; int lineCounter = 1; while ((line = reader.ReadLine()) != null) { writer.WriteLine("{0}. {1}", lineCounter, line); lineCounter++; } Console.WriteLine("Lines added!"); } } } } |
04. Напишете програма която сравнява два текстови файла ред по ред и принтира на конзолата броя на редовете, които са еднакви и броя на редовете, които са различни.
Обяснение: Записвам редовете и на двата файла в стринг масив. След това въртя един for цикъл до дължината на някой от масивите като за всеки ред правя проверка дали текущия ред съвпада или не. Ако имаме съвпадение – увеличаваме int променливата same++, която всъщност ще ни покаже какъв е броя на еднаквите редове. Броя на различните редове намираме като извадим стойността на same от дължината на масива.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
// 04. Write a program that compares two text files line by line // and prints the number of lines that are the same and the // number of lines that are different. Assume the files have // equal number of lines. using System; using System.IO; class SameLine { static void Main() { string[] file1 = File.ReadAllLines("../../file1.txt"); string[] file2 = File.ReadAllLines("../../file2.txt"); int same = 0; for (int i = 0; i < file1.Length; i++) { if (file1[i] == file2[i]) { same++; } } Console.WriteLine("file1.txt: "); PrintFileContent(file1); Console.WriteLine(); Console.WriteLine("file2.txt: "); PrintFileContent(file2); Console.WriteLine(); Console.WriteLine("Same Lines: {0}", same); Console.WriteLine("Different Lines {0}", file1.Length - same); } static void PrintFileContent(string[] file) { for (int i = 0; i < file.Length; i++) { Console.WriteLine(file[i]); } } } |
05. Напишете програма която чете текстов файл който съдържа квадратна матрица от числа и намира подматрицата която има най-голяма сума. Пъврия ред от файла показва големината на матрицата.
Обяснение: Тук по особената и нова за нас част е парсването на матрицата. Това става като първо прочитаме всички редове от файла и ги записваме в стринг масив. След това вземаме размера на матрицата (matrixSize) от първия ред на файла (int.Parse(lines[0])). След това прочитаме останалите редове от файла и попълваме int[,] matrix матрицата. Тук е важно да започнем въртенето на цикъла един ред надолу, за да пропуснем първия ред. След като сме парснали успешно файла – на получената матрица прилагаме метода FindMaxSubmatrixSum(), който знаем от домашните за многомерни масиви в началото на този курс. Накрая записваме резултата в нов файл с помощта на File.WriteAllText().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
// 05. Write a program that reads a text file containing a square // matrix of numbers and finds in the matrix an area of size 2 x 2 // with a maximal sum of its elements. The first line in the input // file contains the size of matrix N. Each of the next N lines contain // N numbers separated by space. The output should be a single number in // a separate text file. Example: // 4 // 2 3 3 4 // 0 2 3 4 17 // 3 7 1 2 // 4 3 3 2 using System; using System.IO; class MaxSubMatrix { static void Main() { string[] lines = File.ReadAllLines("../../matrix.txt"); int matrixSize = int.Parse(lines[0]); int[,] matrix = new int[matrixSize, matrixSize]; // we start from i = 1 for (int i = 1; i < lines.Length; i++) { string[] currentLine = lines[i].Split(); for (int j = 0; j < currentLine.Length; j++) { matrix[i - 1, j] = int.Parse(currentLine[j]); } } File.WriteAllText("../../MaxSubMatrixSum.txt", "The sum of the maximum Submatrix is: " + FindMaxSubmatrixSum(matrix).ToString()); Console.WriteLine("Task Complete!"); } static int FindMaxSubmatrixSum(int[,] matrix) { int currentSum = 0; int bestSum = int.MinValue; for (int i = 0; i < matrix.GetLength(0) - 1; i++) { for (int j = 0; j < matrix.GetLength(1) - 1; j++) { currentSum = matrix[i, j] + matrix[i, j + 1] + matrix[i + 1, j] + matrix[i + 1, j + 1]; if (currentSum > bestSum) { bestSum = currentSum; } } } return bestSum; } } |
06. Напишете програма която прочита файл, който съдържа списък с стрингове, сортира ги и ги записва в нов файл.
Обяснение: Доста кратка задачка. Първо четем всички редове и ги записваме в стринг масив с помощта на File.ReadLines(). След това прилагаме Array.sort() и накрая записваме в нов файл с File.WriteAllLines().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// 06. Write a program that reads a text file containing a list of strings, sorts them and saves them to another text file. Example: // Ivan George // Peter Ivan // Maria Maria // George Peter using System; using System.IO; using System.Linq; class SortFile { static void Main() { string[] fileLines = File.ReadLines("../../file.txt").ToArray(); Array.Sort(fileLines); File.WriteAllLines("../../sortedFile.txt", fileLines); } } |
07. & 08. Напишете програма която заменя всички ‘start’ субстрингове с ‘finish’. Проверете дали програмата Ви работи коректно за големи файлове (Пр. 100mb)
Обяснение: Отново кратка задачка. Четем и записваме съдържанието на файла в string fileContent след което прилагаме заменяне с регулярен израз @’\bstart\b’ и накрая записваме резултата в файла finish.txt. В програмата съм Ви предоставил и метод който генерира голям текстов файл автоматично. GenerateLargeFile(). Ако имате нужда може да го използвате – като предварително трябва да замените текста <!–PUT SIME TEXT HERE–> със текст по ваш избор.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// 07. Write a program that replaces all occurrences of the substring // "start" with the substring "finish" in a text file. Ensure it // will work with large files (e.g. 100 MB). using System; using System.IO; using System.Text.RegularExpressions; class StartFinish { static void Main() { // NB! - First use GenerateLargeFile() Method to create the 100mb start.txt File //GenerateLargeFile(); string fileContent = File.ReadAllText("../../start.txt"); File.WriteAllText("../../finish.txt", Regex.Replace(fileContent, @"\bstart\b", "finish")); Console.WriteLine("Complete"); } private static void GenerateLargeFile() { string inputPath = "../../start.txt"; using (StreamWriter writer = new StreamWriter(inputPath)) { long fileSize = 0; long maxSize = 100000000; // ~100 MB while (fileSize < maxSize) { writer.WriteLine(@"<!-- PUT SOME TEXT HERE-->"); FileInfo file = new FileInfo("../../start.txt"); fileSize = file.Length; } } } } |
09. Напишете програма която изтрива от даден текстови файл – всички нечетни редове.
Обяснение: тук също не е сложно. Това е почти 1 към 1 като първа задача, само, че вместо да пишем на конзолата – записваме в същия файл с StreamWriter.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; // 09. Write a program that deletes from given text file all odd lines. // The result should be in the same file. using System.Collections.Generic; using System.IO; class DeleteOddLines { static void Main() { string[] lines = File.ReadAllLines("../../file.txt"); using (StreamWriter writer = new StreamWriter("../../file.txt")) { for (int i = 0; i < lines.Length; i++) { if (i % 2 != 0) { writer.WriteLine(lines[i]); } } Console.WriteLine("Complete!"); } } } |
10. Напишете програма която екстрактва всичкия смислен текст от подаден XML файл (без xml таговете).
Обяснение: Четем ред по ред от xml файла като на всеки ред завъртаме for цикъл който върви по буквите и проверява дали имаме символ ‘>’. Ако сме срещнали ‘>’ правим проверка дали не сме на края на реда и дали следващия символ не е затваряща скоба ‘<‘. Ако минем проверката – завъртаме още един цикъл, който брои дължината на думата докато не срещнем ‘<‘. След края на този цикъл – ние вече знаем началния индекс на текста който ни трябва и дължината му. С помощта на тези две променливи – извличаме субстринга с line.Substring() и го записваме в List с всички текстове.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
// 10. Write a program that extracts from given XML file all the text without the tags. Example: // <?xml version="1.0"><student><name>Pesho</name><age>21</age><interests count="3"> // <interest> Games</instrest><interest>C#</instrest><interest> Java</instrest></interests></student> using System; using System.Collections.Generic; using System.IO; class ExtractXML { static void Main() { string line = null; List<string> xmlValues = new List<string>(); using (StreamReader reader = new StreamReader("../../XMLFile1.xml")) { while ((line = reader.ReadLine()) != null) { for (int i = 0; i < line.Length; i++) { if (i < line.Length - 1 && line[i] == '>' && line[i + 1] != '<') { int startingIndex = i + 1; int wordLength = 0; while (line[i] != '<') { wordLength++; i++; } xmlValues.Add(line.Substring(startingIndex, wordLength - 1)); } } } } for (int i = 0; i < xmlValues.Count; i++) { Console.WriteLine("{0}: {1}", i+1, xmlValues[i]); } } } |
11. Напишете програма която изтрива от текстови файл всички думи които започват с префикс “test”.
Обяснение: Записваме съдържането на файла в променливата fileContent. След това записваме резултата в същия файл с File.WriteAllText като предварително обработваме текста с регулярен израз който изтрива всички срещания на думи с prefix test @”\b(test\w*)\b”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// 11. Write a program that deletes from a text file all words that start with // the prefix "test". Words contain only the symbols 0...9, a...z, A…Z, _. using System; using System.IO; using System.Text.RegularExpressions; class ContainTest { static void Main() { string fileContent = File.ReadAllText("../../test.txt"); File.WriteAllText("../../test.txt",Regex.Replace(fileContent, @"\b(test\w*)\b", String.Empty)); Console.WriteLine("Replace Complete!"); } } |
12. Напишете програма която приема списък с ключови думи от един текстов файл и изтрива тези думи от друг текстов файл.
Обяснение: Най-важното в този метод е да си генерираме правилен регулярен израз. Това става с този ред: string regex = @”\b(” + String.Join(“|”, File.ReadAllLines(“../../words.txt”)) + @”)\b”; – Това реално ни връща следното нещо: При файл с съдържание:
words.txt:
barbarian
fury
strength
ние получаваме резултат – \b(barbarian|fury|strength)\b, което на практика ни върши перфектна работа за тази задача. След това записваме новия текст в нов файл като предварително сме го обработили с въпросния регулярен израз. Хубаво е да използваме RegexOptions.IgnoreCase, ако искаме да засичаме и думи с различен case. Накрая си засичаме всички ексепшъни по стандартния начин.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// 12. Write a program that removes from a text file all words listed // in given another text file. Handle all possible exceptions in your methods. using System; using System.IO; using System.Text.RegularExpressions; using System.Security; class RemoveByList { static void Main() { try { string regex = @"\b(" + String.Join("|", File.ReadAllLines("../../words.txt")) + @")\b"; string fileContent = File.ReadAllText("../../fileForClearing.txt"); File.WriteAllText("../../ClearedFile.txt", Regex.Replace(fileContent, regex, String.Empty,RegexOptions.IgnoreCase)); Console.WriteLine("Replace Complete!"); } catch (FileNotFoundException) { Console.WriteLine("File Not Found!"); } catch (DirectoryNotFoundException) { Console.WriteLine("Directory Not Found!"); } catch (IOException) { Console.WriteLine("Input/Output Error!"); } catch (SecurityException ex) { Console.WriteLine(ex.Message); } catch (UnauthorizedAccessException) { Console.WriteLine("File Access Error!"); } } } |
13. Напишете програма която приема списък с ключови думи от файл words.txt, намира колко пъти всяка дума се среща в друг файл test.txt и накрая записва резултата в трети файл – result.txt. Резултата трябва да бъде сортиран по брой срещания – в намаляващ ред.
Обяснение: Тук е по-интересно. Ще се наложи да използваме dictionary за целта. Или с други думи – асоциативен масив. (задачата може да се реши и без dictionary, но така е най-приятно). Първо си четем думите и ги записваме в масив words[], иницираме си Dictionary. Започваме да четем файла – ред по ред, като за всеки ред завъртаме по един for цикъл който ни върти всички думи. При този for цикъл правим проверка с регулярен израз дали думата се среща и ако да – колко пъти. Ако имаме срещане на думата – проверяваме дали тази дума вече е записана в dictionary-то – ако да -> увеличаваме бройката с 1ца. Ако не -> добавяме думата в речника. След като сме намерили всички думи и техните бройки – въртим един foreach цикъл при който с помощта на Lambda израз – сортираме речника по подходящия начин и печатим в файла result.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
// 13. Write a program that reads a list of words from a file words.txt // and finds how many times each of the words is contained in another // file test.txt. The result should be written in the file result.txt // and the words should be sorted by the number of their occurrences in // descending order. Handle all possible exceptions in your methods. using System; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; using System.Linq; class WordsCount { static void Main() { string[] words = File.ReadAllLines("../../words.txt"); Dictionary<string, int> dictionary = new Dictionary<string, int>(); using (StreamReader reader = new StreamReader("../../fileForScaning.txt")) { string line; while ((line = reader.ReadLine()) != null) { for (int i = 0; i < words.Length; i++) { string regex = @"\b" + words[i] + @"\b"; MatchCollection matches = Regex.Matches(line, regex,RegexOptions.IgnoreCase); if (dictionary.ContainsKey(words[i])) { dictionary[words[i]] += matches.Count; } else { dictionary.Add(words[i], matches.Count); } } } } using (StreamWriter writer = new StreamWriter("../../result.txt")) { foreach (var wordCount in dictionary.OrderByDescending(key => key.Value)) { writer.WriteLine("{0} - {1}", wordCount.Key, wordCount.Value); } Console.WriteLine("Count Complete - Please Check result.txt file!"); } } } |
Това са задачките от домашното – като цяло са доста лесни и приятни. В същото време са практични и полезни.
Силно ви препоръчвам да прочетете повече за регулярните изрази. Те са изключително полезни при работа с стрингове и текст.
Ако имате някакви въпроси или критика – пишете в коментарите.
Полезни връзки:
– Тестър за Регулярни изрази
– Полезна статия за работа с файлове в C#
Holy Warrior
Хубаво си е да имаш скенер 🙂
Тук съм започнал един паладин от книгата на Matt Dixon, но е още в начален етап и не е завършен.
Начални цветове: