Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
lets834
15 / 15 / 5
Регистрация: 17.02.2015
Сообщений: 102
Завершенные тесты: 2
#1

Сравнить строки двух файлов - C#

07.03.2017, 04:59. Просмотров 321. Ответов 11
Метки нет (Все метки)

Здравствуйте. Подскажите/помогите пожалуйста сравнить строки двух файлов. Вот всё, что у меня есть. При отсутствии совпадении одной строки, нужно что бы выдавало ошибку о несовпадении. Файлы, которые нужно сравнить прикрепил. Можно было бы сравнить два массива, но не знаю как к ним обратится в точке входа.
C#
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;
 
 
namespace t2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*******************************ФАЙЛ t2.txt******************************");
            WriteFile("t2.txt");
            Console.WriteLine("*****************************ФАЙЛ etalon.txt****************************");
            ReadFile("etalon.txt");
            Console.ReadLine();           
            
        }
        static void WriteFile(string procs)
        {
            StreamWriter wr = new StreamWriter(procs);
            Process[] pr = Process.GetProcesses();
            int pros = pr.Length;
            string str = @"(System.Diagnostics.Process)"; //строка, которую нужно удалить из массива процессов
            for (int i = 0; i < pros; i++)
            {                
                string k = pr[i].ToString();                
                string regex = Regex.Replace(k, str, String.Empty); //стринговая переменная с удаленной строкой 
                Console.WriteLine(regex);                
                wr.WriteLine(regex);
            }            
            wr.Close();
            return;
        }
        static void ReadFile(string etalon)
        {
            StreamReader rd = new StreamReader(etalon);
            string ds = rd.ReadToEnd();
            Console.WriteLine(ds.ToArray());
            
        }
    }
}
0
Вложения
Тип файла: txt t2.txt (841 байт, 6 просмотров)
Тип файла: txt etalon.txt (818 байт, 4 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2017, 04:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сравнить строки двух файлов (C#):

Сравнить строки в двух файлах - C#
Доброго времени суток, уважаемый форум! Возникла проблема: имеется два файла *.txt **.txt. Нужно считать из них строки, те из них которые...

Сравнить элементы двух матриц и вывести равные в отдельный массив - C#
Здравствуйте. Уже искал помощи на форуме, но все равно завис, хоть задача и не выглядит особо сложной. По условию есть две матрицы...

Сравнить содержимое первого файла с содержимым файлов, которые хранятся в каталогах - C#
1. есть какой-то файл 1.txt, в каждой строке которого хранятся имена, например: s1, s2, s3, s4, s5. 2. есть каталоги (например: k1, k2,...

Вычислить, вывести на экран в соответствующем формате и сравнить значения двух функций. - C#
Вычислить, вывести на экран в соответствующем формате и сравнить значения двух функций (результаты должны совпадать). Изображение с...

сравнить строки - C#
В непривязанном к источнику DataGridView, я изменяю строку. После того, как изменила, я щелкаю на другую строку (Меняется SelectedIndex),...

Сравнить строки массива - C#
Нужно найти по min элементу в каждой строке массива и сложить затем эти элементы. Вот массив задаю, а как дальше сравнить все элементы в...

11
jetyb
148 / 148 / 47
Регистрация: 26.10.2012
Сообщений: 468
Завершенные тесты: 1
07.03.2017, 08:06 #2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        bool CompareFiles(string fileName1, string fileName2)
        {
            var fileInfo1 = new FileInfo(fileName1);
            var fileInfo2 = new FileInfo(fileName2);
            if (fileInfo1.Length != fileInfo2.Length) return false;            
            using (var fs1 = fileInfo1.OpenRead())
            using (var fs2 = fileInfo2.OpenRead())
            {
                while (fs1.CanRead)
                {
                    if (fs1.ReadByte() != fs2.ReadByte()) return false;
                }                
            }
            return true;
        }
Также (если требуется особое сравнение строк) можно воспользоваться методом File.ReadAllLines и сравнением массивов строк.
0
Usaga
Эксперт .NET
2254 / 1922 / 352
Регистрация: 21.01.2016
Сообщений: 7,381
Завершенные тесты: 2
07.03.2017, 08:13 #3
jetyb, тогда уже завернуть потоки в BufferedStream или явно считывать блоки по несколько килобайт сравнивать массивы. Но уж никак не по байтам читать...
0
Aferuga
190 / 187 / 75
Регистрация: 20.05.2015
Сообщений: 663
Завершенные тесты: 1
07.03.2017, 08:33 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от lets834 Посмотреть сообщение
При отсутствии совпадении одной строки,
Не понятно что с чем сравнивать, например можно так:
Кликните здесь для просмотра всего текста
C#
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
        private string[] test_str; 
 
static void Main(string[] args)
        {
            Console.WriteLine("*******************************ФАЙЛ t2.txt******************************");
            WriteFile("t2.txt");
            Console.WriteLine("*****************************ФАЙЛ etalon.txt****************************");
            ReadFile("etalon.txt");
            Console.ReadLine();           
            
        }
        static void WriteFile(string procs)
        {
            StreamWriter wr = new StreamWriter(procs);
            Process[] pr = Process.GetProcesses();
            int pros = pr.Length;
            string str = @"(System.Diagnostics.Process)"; //строка, которую нужно удалить из массива процессов
            test_str = new string[pros];
            for (int i = 0; i < pros; i++)
            {                
                string k = pr[i].ToString();                
                string regex = Regex.Replace(k, str, String.Empty); //стринговая переменная с удаленной строкой 
                if (regex != String.Empty) //стринговая переменная с удаленной строкой 
                {
                    Console.WriteLine(regex); 
                    test_str[i] = regex;
                }
 
                               
                wr.WriteLine(regex);
            }            
            wr.Close();
            return;
        }
        static void ReadFile(string etalon)
        {
            StreamReader rd = new StreamReader(etalon);
                       while (!rd.EndOfStream){
            string ds = rd.ReadLine();
                if (test_str.Contains(ds))
                    Console.WriteLine(ds);
                else Console.WriteLine(ds+" error");
 
 
            
        }
1
jetyb
148 / 148 / 47
Регистрация: 26.10.2012
Сообщений: 468
Завершенные тесты: 1
07.03.2017, 09:30 #5
Usaga, я подозреваю что Stream сам как раз сам и подгружает все буферами нужного размера. Загрузка собственными буферами сведется к такой же побайтовой поверке, но я не знаю оптимального размера буфера, наверное зависящего еще и от железа.
0
Usaga
Эксперт .NET
2254 / 1922 / 352
Регистрация: 21.01.2016
Сообщений: 7,381
Завершенные тесты: 2
07.03.2017, 09:43 #6
Цитата Сообщение от jetyb Посмотреть сообщение
я подозреваю что Stream сам как раз сам и подгружает все буферами нужного размера
На это полагаться не стоит. Лучше это сделать явно, благо, что несложно. Оптимальный размер - от четырёх килобайт.

Ну и вызывать в цикле некую функцию для получения всего одного байта - тоже не очень эффективное занятие. Тут можно было бы получить сразу весь буфер и сравнить его разом.

Но, как уже выше заметили, фиг знает, что ТС имел в виду, может тут совсем всё по-другому нужно сделать
0
Skalpel02
10 / 10 / 4
Регистрация: 21.09.2016
Сообщений: 85
Завершенные тесты: 3
07.03.2017, 22:56 #7
Сам алгоритм сравнения строк будет такой
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            StreamReader first = new StreamReader(path);//Задаем путь к первому файлу
            StreamReader second = new StreamReader(path1);//Задаем путь ко второму файлу
            
            string str1=null;
            string str2 = null;
                     
            while (!first.EndOfStream&&!second.EndOfStream) {
 
                str1 = first.ReadLine();
                str2 = second.ReadLine();
                if (str1 != str2)
                {
                    Console.WriteLine("Файлы разные");
                    break;
                } 
            }
0
lets834
15 / 15 / 5
Регистрация: 17.02.2015
Сообщений: 102
Завершенные тесты: 2
08.03.2017, 04:12  [ТС] #8
хмм

Добавлено через 5 минут
Цитата Сообщение от Aferuga Посмотреть сообщение
Не понятно что с чем сравнивать, например можно так:
Вроде бомба, но у меня ошибка. Помогите пожалуйста. Не пойму, что сделал не так:

"Ошибка 1 Для нестатического поля, метода или свойства "t2.Program.test_str" требуется ссылка на объект C:\Documents\Visual Studio 2012\Projects\t2\t2\Program.cs 32 13 t2"
0
Aferuga
190 / 187 / 75
Регистрация: 20.05.2015
Сообщений: 663
Завершенные тесты: 1
08.03.2017, 07:19 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
в первой строке просто string[]
0
lets834
15 / 15 / 5
Регистрация: 17.02.2015
Сообщений: 102
Завершенные тесты: 2
08.03.2017, 07:56  [ТС] #10
Цитата Сообщение от Aferuga Посмотреть сообщение
в первой строке просто string[]
C#
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
namespace t2
{
    class Program
    {
        string[] test_str;
        static void Main(string[] args)
        {
            Console.WriteLine("*******************************ФАЙЛ t2.txt******************************");
            WriteFile("t2.txt");
            Console.WriteLine("*****************************ФАЙЛ etalon.txt****************************");
            ReadFile("etalon.txt");            
            Console.ReadLine();           
            
        }
 
         static void WriteFile(string procs)
        {
            StreamWriter wr = new StreamWriter(procs);
            Process[] pr = Process.GetProcesses();
            int pros = pr.Length;
            string str = @"(System.Diagnostics.Process)"; //строка, которую нужно удалить из массива процессов
            test_str = new string[pros];
            for (int i = 0; i < pros; i++)
            {                
                string k = pr[i].ToString();                
                string regex = Regex.Replace(k, str, String.Empty); //стринговая переменная с удаленной строкой 
                if (regex != String.Empty)
                {
                    Console.WriteLine(regex);
                    test_str[i] = regex;
                    wr.WriteLine(regex);
                }
                wr.WriteLine(regex);
            }            
            wr.Close();
            return;
        }
 
        static void ReadFile(string etalon)
        {
            StreamReader rd = new StreamReader(etalon);
            while (!rd.EndOfStream)
            {
                string ds = rd.ReadLine();
                if (test_str.Contains(ds))
                    Console.WriteLine(ds);
                else Console.WriteLine(ds + " error");
            }            
        }       
    }
}
Все равно выдает ошибку.
0
Aferuga
190 / 187 / 75
Регистрация: 20.05.2015
Сообщений: 663
Завершенные тесты: 1
08.03.2017, 08:33 #11
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
замените static на private
1
lets834
15 / 15 / 5
Регистрация: 17.02.2015
Сообщений: 102
Завершенные тесты: 2
08.03.2017, 08:59  [ТС] #12
Цитата Сообщение от Aferuga Посмотреть сообщение
замените static на private
Бомба, спасибо большое, друг
0
08.03.2017, 08:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2017, 08:59
Привет! Вот еще темы с ответами:

Сравнить строки посимвольно - C#
Здравствуйте,запутался немного, есть 2 строки состоящие из 16 рандомно расставленных букв а и b (&quot;a,b,b,a,b,b,a,b ...и т.д.) нужно сравнить...

Как сравнить две строки? - C#
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); ...

Как сравнить две строки - C#
Разработать метод, который в качестве исходных данных получает 2 строки символов. Возвращаемый результат – строка, содержащая только те...

Сравнить строки в txt файлах - C#
Помогите пожалуйста!Есть два txt файла и нужно их сравнить. Если строки не совпадают вывести сообщение пользователю что строки не совпадают...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru