Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
1

Сравнение 2х текстовых файлов построчно каждый символ

11.09.2015, 18:59. Показов 4678. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. У меня вот такой вопрос, довольно сложный. Есть два текстовых файла. В них записан построчно набор символов одинаковой длины. Строки могут повторятся несколько раз. При сравнении 1-го файла со вторым все 5 позиций из 1го файла должны совпасть не более 1 раза (могут совсем не совпасть). Совпадение по 4 позициям должно быть в диапазоне от 2 до 5. 3 позиции имеют совпадение от 5 до 10. Все, что не входит в какой-либо диапазон - забывается. А все, что входит нужно записать в новый текстовый файл построчно.
В первом файле к примеру такой набор: Во втором такой:
12345 22000
12346 10348
12356 12323
10493 12112
10000 12345
... ...
и т.д. n-ое количество строк


В первом файле в первой строке записано 12345. Мы сравниваем с каждой строкой из второго файла и ищем совпадения. С 1-ой строкой совпадает в 1 символ, мы ищем, где совпадает большее кол-во, далее идет вторая строка, с ней совпадение по 3 символам, про совпадение с 1ой строкой забыли. Далее 3-я строка совпадение также по трем символам уже имеем 2 раза. С 3 совпадениями запоминаем. 4-ая строка - совпадение по 2 символам, пропускаем. 5-ая строка - полностью совпадает по всем 5 позициям. Далее таким образом сравниваются все строки в файле, если удовлетворяет каждому диапазону, то записывается в новый.

12345
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2015, 18:59
Ответы с готовыми решениями:

Сравнение содержимого двух текстовых файлов построчно
Здравствуйте! Очень нужна помощь! Есть текстовый файл 1.txt (50 строк), текстовый файл 2.txt...

Сравнение содержимого двух текстовых файлов построчно
Доброго всем дня. Есть три текстовых файла. В первом 1.txt - список "зеленых" IP. Во второй 2.txt -...

Сравнение 2 текстовых файлов
Доброго времени суток, я уже создавал здесь тему и мне помогли добрые люди, ещё раз повторюсь я...

Сравнение текстовых файлов
как сравнить два текстовых файла, что бы потом можно было исходя из результата сравнения делать...

12
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
12.09.2015, 20:25  [ТС] 2
Могу написать принцип, но с переводом в windows form нужна помощь. К определениям и синтаксису не придирайтесь, могу напутать.
Открывается 1 текстовый файл
Открывается 2 текстовый файл
С 1 файла считывается первая строка и сравнивается с каждой строкой второго файла (for 1 to n ), запускается счетчик совпадений. Если совпадений более 1, то переходим на вторую строку 1го файла и сравниваем ее с каждой строкой второго файла. Если совпадений 1 или нет вообще, то эта же строка 1 файла снова сравнивается с каждой строкой второго файла, но уже по маске, где сперва не учитывается 1ый символ и в первом файле и во втором. теперь это сравнивается с каждой строкой 2го файла, и при обнаружении совпадений запускается счетчик и считает кол-во совпадений, если нет, то минуя счетчик переходим делее, а далее не учитываем только 2-ой символ и также сравниваем с каждой строкой второго файла, при обнаружении совпадений плюсуем их кол-во к счетчику и так, пока не прогоним всю строку. Далее смотрим кол-во совпадений по 4 позициям, если их меньше 2х или больше 5, то переходит ко второй строке первого файла, иначе уже сравниваем по 3 позициям (##345, #2#45, #23#5, #234#, 1##45,... 123##)
аналогично предыдущему запускается счетчик, при совпадениях от 5 до 10 строка записывается в новый текстовый документ, при совпадении менее или более указанного диапазона, минуя запись, переходим ко второй строке 1го файла и также сравниваем с каждой строкой второго файла. И так, пока на сравним все. Помогите реализовать
0
52 / 48 / 23
Регистрация: 27.07.2015
Сообщений: 145
12.09.2015, 21:21 3
Задача у Вас делится на две:
1. Прочитать из текстового файла в список строк. Здесь вот такой код.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
 
            List<string> input1 = new List<string>();
            
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                using (StreamReader streamReader1 = new StreamReader(openFileDialog1.FileName))
                {
                    string buffStr;
 
                    while ((buffStr = streamReader1.ReadLine()) != null)
                    {
                        input1.Add(buffStr);
                    }
                }
            }
2. Реализовать свой алгоритм обработки этой мини-базы данных. Вам, судя по всему, пока нужно делать перебором через цикл, как-то так:
C#
1
2
3
4
5
            List<string> output = new List<string>();
            for (int i = 0; i < input1.Count; i++)
            {
                output.Add(input1[i] + " out");
            }
Или так
C#
1
2
3
4
            foreach (string str in input1)
            {
                output.Add(str + "out");
            }
Но лучше сесть за книжки и поработать над теорией. Лямбды, LINQ, регулярные выражения - C# позволит реализовать Ваш алгоритм буквально в две строчки, а счетчики, скорей всего, не понадобятся.
1
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
22.09.2015, 22:18  [ТС] 4
Примерно так у меня получилось, но такое чувство, что программа зацикливается. Либо слишком долго обрабатывает данные (я не дождался конца)
Что я сделал не так?

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
  List<string> variant = new List<string>();
                StreamReader variantRead = new StreamReader("C:\\Program\\variant.txt");
                string variantstr;
 
                while ((variantstr = variantRead.ReadLine()) != null)
                {
 
                    List<string> PredPos = new List<string>();
                    StreamReader PredPosRead = new StreamReader("C:\\Program\\cod2.txt");
                    string PredPosStr;
 
                    while ((PredPosStr = PredPosRead.ReadLine()) != null)
                    {
                        int sov = 0;
                        int sov5 = 0;
                        int sov4 = 0;
                        int sov3 = 0;
                       
                            for (int i = 0; i < variant.Count; i++)
                            {
                                if (variantstr[i] == PredPosStr[i])
                                {
                                    sov++;
                                }
                                {
                                    if (sov == 3)
                                    { sov3 = sov3 + 1; }
                                    if (sov == 4)
                                    { sov4 = sov4 + 1; }
                                    if (sov == 5)
                                    { sov5 = sov5 + 1; }
                                                                    }
 
                                if ( sov3 < 11 && sov3 > 4 && sov4 < 6 && sov4 > 1 && sov5 < 2)
                                {
                                    variant.Add(variantstr);
                                   /* int sov = 0;
                        sov5 = 0;
                        sov4 = 0;
                        sov3 = 0;
                                    */
 
                                }
                                File.WriteAllLines("C:\\Program\\Konec.txt", variant);
                                MessageBox.Show("Все варианты готовы!");
                            }
                        }
                    }
                }
0
52 / 48 / 23
Регистрация: 27.07.2015
Сообщений: 145
22.09.2015, 22:22 5
Для каждой строки из файла C:\\Program\\variant.txt вы заново перечитываете файл C:\\Program\\cod2.txt. Вот он у Вас и тормозит.

Прочитайте два файла каждый в свой List<T>. И дальше работайте с этими списками.
1
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
23.09.2015, 19:18  [ТС] 6
Вы имеете ввиду так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
                List<string> variant = new List<string>();
                StreamReader variantRead = new StreamReader("C:\\Program\\variant2.txt");
                string variantstr;
                StreamReader PredPosRead = new StreamReader("C:\\Program\\cod2.txt");
                string PredPosStr;
                while ((variantstr = variantRead.ReadLine()) != null)
                {
 
                    //List<string> PredPos = new List<string>();
                    
 
                    while ((PredPosStr = PredPosRead.ReadLine()) != null)
                    {
Добавлено через 3 минуты
Или так?
C#
1
2
3
4
5
6
7
List<string> variant = new List<string>();
                StreamReader variantRead = new StreamReader("C:\\Program\\variant2.txt");
                string variantstr;
                StreamReader PredPosRead = new StreamReader("C:\\Program\\cod2.txt");
                string PredPosStr;
                while (((variantstr = variantRead.ReadLine()) != null)&&((PredPosStr = PredPosRead.ReadLine()) != null))
                {
0
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
24.09.2015, 22:39  [ТС] 7
Zhavoronkov5, Или что-то другое имеете ввиду?
При этих вариантах результат тот же
0
52 / 48 / 23
Регистрация: 27.07.2015
Сообщений: 145
25.09.2015, 00:42 8
Допустим, в каждом из Ваших файлов по 100 строк (небольшие совсем). Тогда вот этот цикл:
C#
1
while ((variantstr = variantRead.ReadLine()) != null)
будет выполнен 100 раз. Но внутри этого цикла у Вас сидит еще один цикл, который тоже должен выполнится 100 раз.
C#
1
while ((PredPosStr = PredPosRead.ReadLine()) != null)
Итого получаем 100*100 = 10 000 операций чтения строки из файла. При этом полезных будет 100+100=200, а остальные 9 800 будут выполнены вхолостую из-за программиста.
1
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
26.09.2015, 23:21  [ТС] 9
Zhavoronkov5, Можете еще подсказать, как именно списки сравнить?
0
52 / 48 / 23
Регистрация: 27.07.2015
Сообщений: 145
26.09.2015, 23:56 10
Цитата Сообщение от igorigrok Посмотреть сообщение
С 1 файла считывается первая строка и сравнивается с каждой строкой второго файла (for 1 to n ), запускается счетчик совпадений.
C#
1
2
3
4
5
6
7
8
9
            int counter = 0;
 
            for (int i = 1; i < list2.Count; i++)
            {
                if (list1[0] == list2[i])       
                {                               
                    counter++;
                }
            }
И так далее, пока не реализуете весь свой алгоритм
1
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
27.09.2015, 13:24  [ТС] 11
Zhavoronkov5, Я понимаю, что уже надоел, но у меня, возможно, последний вопрос. Можно ли как-то в списке объявить строку?
Я хочу сравнить каждую строку с каждой, и если они неравны, то сравнить уже каждый символ в этой строке и найти кол-во совпадающих


Код
           int counter = 0;

           for (int j = 0; j < variantlist.Count; j++)
                {
                    for (int i = 0; i < PredPoslist.Count; i++)
                    {                       
                        if (list1[j] != list2[i])
                            { for (int k = 0; k < 15; k++)
                            if (str1[k]==str2[k])
                               {counter++;}
                            }
                     }
                 }
Добавлено через 7 минут
Zhavoronkov5, Zhavoronkov5, Я понимаю, что уже надоел, но у меня, возможно, последний вопрос. Можно ли как-то в списке объявить строку?
Я хочу сравнить каждую строку с каждой, и если они неравны, то сравнить уже каждый символ в этой строке и найти кол-во совпадающих


Код
           int counter = 0;

           for (int j = 0; j < list1.Count; j++)
                {
                    for (int i = 0; i < list2.Count; i++)
                    {                       
                        if (list1[j] != list2[i])
                            { for (int k = 0; k < 15; k++)
                            if (str1[k]==str2[k])
                               {counter++;}
                            }
                     }
                 }
0
52 / 48 / 23
Регистрация: 27.07.2015
Сообщений: 145
28.09.2015, 15:23 12
Что значит - объявить строку?
Чем не устраивает запись list1[i] - получаете полный доступ к элементу списка номер i.

Каждую строку типа string можно представить в виде массива char. Соответственно, одиночный символ считываете также, через квадратные скобки.
1
1 / 1 / 0
Регистрация: 11.09.2015
Сообщений: 25
28.09.2015, 21:43  [ТС] 13
Zhavoronkov5,
Спасибо большое. Все реализовал, что хотел.
При первом варианте (Когда для каждой строки первого файла перечитывал полностью второй файл) программа обрабатывала данные 15-20 минут.
При втором варианте около 7 минут.
Еще раз спасибо, только теперь за терпение)
0
28.09.2015, 21:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2015, 21:43
Помогаю со студенческими работами здесь

Сравнение текстовых файлов
Имеетеся батник, который считывает строку из одного текстового файла, сравнивает ее с аналогичной...

Сравнение текстовых файлов.
Добрый день! Такое вот задание. Даны 2 текстовых файла. Проверить, все ли строки из 1-го...

Сравнение файлов построчно из списка с удалением отсутствующих строк
Доброго времени суток. Пользуюсь скриптом для CMD/BAT set fname=01.txt findstr /g:&quot;02.txt&quot;...

Сравнение двух текстовых файлов
Помогите пожалуйста с прогой) В С# уровень Hello World =( В С# выполнить сравнение двух текстовых...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru