Сравните два текстовых файла и покажите, что такое ЖЕ
Мне нужна помощь по сравнению двух файлов. Я могу распечатать, в чем разница между ними, но я не могу понять, как распечатать то же самое между ними, когда они не правы. Кто-нибудь может мне помочь? Заранее спасибо!
private void button2_Click(object sender, EventArgs e)
{
try
{
//Reads files line by line
var fileOld = File.ReadLines(Old);
var fileNew = File.ReadLines(New); //Ignores cases in files
IEnumerable<String> OldTxt = fileOld.Except(fileNew, StringComparer.OrdinalIgnoreCase);
IEnumerable<String> NewTxt = fileNew.Except(fileOld, StringComparer.OrdinalIgnoreCase);
FileCompare compare = new FileCompare();
bool areSame = OldTxt.SequenceEqual(NewTxt);
if (areSame == true)
{
MessageBox.Show("They match!");
}
else if(areSame == false)
{
// Find the set difference between the two files.
// Print to Not Equal.txt
var difFromNew = (from file in OldTxt
select file).Except(NewTxt);
using (var file = new StreamWriter(NotEqual))
{
foreach (var notEq in difFromNew)
{
file.WriteLine(notEq.ToString() + "\n", true);
}
}
MessageBox.Show("They are not the same! Please look at 'Not Equal.txt' to see the difference. Look at 'Equal.txt' to see what is the same at this time.");
}
}
catch
{
MessageBox.Show("'NewConvert.txt' or 'OldConvert.txt' files does not exist.");
}
}
1 ответ
Во-первых, я думаю, что в вашем коде может быть ошибка. 'fileOld' содержит все содержимое старого файла, а 'OldTxt' содержит только текст старого файла, которого нет в новом файле. После моего ответа см. Ниже некоторые идеи по очистке кода.
Я думаю, что вы ищете Intersect
, который возвращает элементы, которые имеют два IEnumerables:
var commonItems = fileOld.Intersect(fileNew);
Кроме того, так как у вас уже есть список различий, захваченных в difFromNew
Вы могли бы использовать Except
снова:
var difFromNew = fileOld.Except(fileNew); // Note I fixed what I think is a bug here
var commonItems = fileOld.Except(difFromNew);
Некоторые потенциальные ошибки:
SequenceEqual
означает, что элементы не только одинаковы, но и в том же порядке. Если вы заботитесь о заказе, то это уместно. Проблема в том, что это затруднит отображение различий, потому что другие методы, которые вы используете для сравнения списков (Except
а такжеIntersect
) не заботятся о порядке, только независимо от того, существует ли пункт. Так что еслиfileOld
содержит предметыcat | dog
а такжеfileNew
содержит предметыdog | cat
тогда они не будут равны, но вы также не сможете показать различия (fileOld.Except(fileNew)
будет содержать0
Предметы).- В вашем
diffFromNew
список, вы принимаетеOldTxt
, который является уникальным текстом из старого файла, и делаетExcept
противNewTxt
, который является уникальным текстом из нового файла. Между этими двумя не может быть совпадений - на самом делеOldTxt
уже содержитdiffFromNew
по умолчанию.
Вот один из способов получения списков, которые вы ищете:
var oldFilePath = "c:\\oldFile.txt";
var newFilePath = "c:\\newFile.txt";
var oldFileTxt = File.ReadLines(oldFilePath);
var newFileTxt = File.ReadLines(newFilePath);
// Determine if they're equal by checking if there are not any unique items
var filesAreSame = !oldFileTxt.Except(newFileTxt, StringComparer.OrdinalIgnoreCase).Any();
var commonItems = oldFileTxt.Intersect(newFileTxt, StringComparer.OrdinalIgnoreCase);
var uniqueOldItems = oldFileTxt.Except(commonItems, StringComparer.OrdinalIgnoreCase);
var uniqueNewItems = newFileTxt.Except(commonItems, StringComparer.OrdinalIgnoreCase);
Вот как может выглядеть код с этими изменениями:
if (filesAreSame)
{
MessageBox.Show("They match!");
}
else
{
var commonItems = oldFileTxt.Intersect(newFileTxt, StringComparer.OrdinalIgnoreCase);
var uniqueOldItems = oldFileTxt.Except(commonItems, StringComparer.OrdinalIgnoreCase);
var uniqueNewItems = newFileTxt.Except(commonItems, StringComparer.OrdinalIgnoreCase);
var notEqualsFileText = new StringBuilder();
if (uniqueOldItems.Any())
{
notEqualsFileText.AppendLine(
$"Entries in {oldFilePath} that are not in {newFilePath}:");
notEqualsFileText.AppendLine(string.Join(Environment.NewLine, uniqueOldItems));
}
if (uniqueNewItems.Any())
{
notEqualsFileText.AppendLine(
$"Entries in {newFilePath} that are not in {oldFilePath}:");
notEqualsFileText.AppendLine(string.Join(Environment.NewLine, uniqueNewItems));
}
File.WriteAllText(notEqualFilePath, notEqualsFileText.ToString());
var equalsFileText = new StringBuilder();
if (commonItems.Any())
{
equalsFileText.AppendLine(
$"Entries that are common in both {newFilePath} and {oldFilePath}:");
equalsFileText.AppendLine(string.Join(Environment.NewLine, commonItems));
}
else
{
equalsFileText.AppendLine(
$"There are no common entries in both {newFilePath} and {oldFilePath}.");
}
File.WriteAllText(equalFilePath, equalsFileText.ToString());
MessageBox.Show("The files are not the same! Please look at 'Not Equal.txt' to see the difference. Look at 'Equal.txt' to see what is the same at this time.");
}