@Ruslan_PR

Как записать отличия между двумя текстовыми файлами в 3й файл?

Суть вопроса: написать консольное приложение, которое сравнивало бы два текстовых файла (до изменения и файл после изменения) и записывало бы в 3й файл результат по следующим принципам:
одинаковые строки остаются как есть,
добавленные строки (в файл после изменения) записываются в 3й файл и помечаются знаком +,
соответственно удаленные - знаком -,
измененные знаком *
Пока написал код следующий:
public string pathSourceFile;
        public string pathChangeFile;

        public void GetInfo()
        {
            //для теста
            Console.WriteLine($"До изменения: {pathSourceFile}  После изменения: {pathChangeFile}");

             DiffText(pathSourceFile, pathChangeFile);
        }

        public void DiffText(string pathS, string pathCh)
        {
            List<string> SourceList = new List<string>();
            List<string> ChangeList = new List<string>();
            List<string> ResultList = new List<string>();

            using (StreamReader srS = new StreamReader(pathS))
            {
                string lineS;
                while ((lineS = srS.ReadLine()) != null)
                {
                    SourceList.Add(lineS);
                    Console.WriteLine(lineS);
                }
            }

            using (StreamReader srCh = new StreamReader(pathCh))
            {
                string lineCh;
                while ((lineCh = srCh.ReadLine()) != null)
                {
                    ChangeList.Add(lineCh);
                    Console.WriteLine(lineCh);
                }
            }

            SourceList.Count();
            ChangeList.Count();

            int j;

            if(SourceList.Count() < ChangeList.Count())
            {
                j = SourceList.Count();
            }
            else
            {
                j = ChangeList.Count();
            }
            for (int i = 0; i < j; i++)
            {
                if (SourceList[i] == ChangeList[i])
                {
                    ResultList.Add(SourceList[i].ToString());
                }               
            }

            ResultList.Count();
        }

Проблема заключается в следующем:
Если элементы массивов равны, то строки одинаковы; с этим понятно.
А вот если не равны, то либо строка изменена, либо новая или удалена..
Возможно нужно по индексу еще сравнивать
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
А суть задачи в чем именно?
- Реализовать саму программу - которая так делать будет?
- Реализовать именно сам алгоритм?

В целом есть вот такая библиотека - https://github.com/google/diff-match-patch
Думаю она поможет в обоих случаях
- Подключил, и вуаля
- Можно разобрать их алгоритм
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mindtester
@mindtester Куратор тега C#
делаю странные вещи..чаще на C#..иногда за деньги
добавленные строки (в файл после изменения) записываются в 3й файл и помечаются знаком +,
соответственно удаленные - знаком -,
измененные знаком *
сформулируйте четкие критерии измененной строки. допустим, после ряда совпадающих строк, обнаруживаться такие (в исходном и измененном файле соответственно):
- b00a4ccdf4a46a8d9e69da27d52e92f8cd04d0d637f38b763f873c45b9a05bcf
- 0afd10788608c552b0f25c5d644977e66d1185be45fee7dff716052e273115a3
жирным шрифтом выделен 0, как вероятный повод считать что эти строки имеют сходство.. так ли на самом деле? как понять что строка действительно изменена, а не новая?

совет

using (StreamReader srS = new StreamReader(pathS))
            {
                string lineS;
                while ((lineS = srS.ReadLine()) != null)
                {
                    SourceList.Add(lineS);
                    Console.WriteLine(lineS);
                }
            }

            using (StreamReader srCh = new StreamReader(pathCh))
            {
                string lineCh;
                while ((lineCh = srCh.ReadLine()) != null)
                {
                    ChangeList.Add(lineCh);
                    Console.WriteLine(lineCh);
                }
            }


1 - тяжеловесно и старомодно. и можно было бы вынести повторяющияся код в отдельный метод, но.. все уже сделано за нас.. и для нас..
2 - стильно, молодежно (с) примерно так
SourceList = File.ReadAllLines(pathS).ToList();
ChangeList = File.ReadAllLines(pathCh).ToList();

Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы