Delphi сравнить два файла

Обновлено: 05.02.2023

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, comobj, StdCtrls, Grids, Buttons;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
StringGrid2: TStringGrid;
Button2: TButton;
Button3: TButton;
BitBtn1: TBitBtn;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;

function xls_to_stringgrid(agrid: tstringgrid; axlsfile: string): boolean;
const
xlcelltypelastcell = $0000000b;
var
xlapp, sheet: olevariant;
rangematrix: variant;
x, y, k, r: integer;
begin
result := false;
// create excel-ole object
xlapp := createoleobject('excel.application' );
try
// hide excel
xlapp.visible := false;

// open the workbook
xlapp.workbooks.open(axlsfile);

// sheet := xlapp.workbooks[1].worksheets[1];
sheet := xlapp.workbooks[extractfilename(axlsfile)].worksheets[1];

// in order to know the dimension of the worksheet, i.e the number of rows
// and the number of columns, we activate the last non-empty cell of it

sheet.cells.specialcells(xlcelltype lastcell, emptyparam).activate;
// get the value of the last row
x := xlapp.activecell.row;
// get the value of the last column
y := xlapp.activecell.column;

// set stringgrid's row &col dimensions.

agrid.rowcount := x;
agrid.colcount := y;

// assign the variant associated with the worksheet to the delphi variant

rangematrix := xlapp.range['a1', xlapp.cells.item[x, y]].value;
// define the loop for filling in the tstringgrid
k := 1;
repeat
for r := 1 to y do
agrid.cells[(r - 1), (k - 1)] := rangematrix[k, r];
inc(k, 1);
agrid.rowcount := k + 1;
until k > x;
// unassign the delphi variant matrix
rangematrix := unassigned;

finally
// quit excel
if not varisempty(xlapp) then
begin
// xlapp.displayalerts := false;
xlapp.quit;
xlapp := unassigned;
sheet := unassigned;
result := true;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if xls_to_stringgrid(stringgrid1, 'D:\Delphi\proba\ÃÅËÈÎÑ') then
showmessage('Òàáèöà óñïåøíî çàãðóæåíà!');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if xls_to_stringgrid(stringgrid2, 'D:\Delphi\proba\ÒÎÂ') then
showmessage('Òàáèöà óñïåøíî çàãðóæåíà!');
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
for i := 1 to Form1.StringGrid1.ColCount - 1 do
if StringGrid1.Cells[0, i] = StringGrid2.Cells[0, i] then Form2.Memo1.Lines.Add(StringGrid1.C ells[0, i])
else Form2.Memo2.Lines.Add(StringGrid1.C ells[0, i]);
Form2.ShowModal;
end;

Присутствуют и в первом и во втором списке
111111111111110
111111111111111
111111111111112
111111111111113

А должно быть
Присутствуют и в первом и во втором списке
111111111111110
111111111111111
111111111111112
111111111111113
111111111111114

Отсутствуе во втором списке
111111111111115
111111111111123
111111111111125
111111456879521

Прошу помощи в реализации задачи.
В программе нужно сравнить два файла (разной длины, или одинаковой).
Количество не совпадений (если такие есть) посчитать и вывести в label, или
если нет не совпадений вывести в label , что не совпадений нет.

Можно , пожалуйста пример , а то в интернете совсем нет информации по сравнению именно бинарных файлов.
Буду рад, любой помощи и примеру.
Спасибо!

Сравнить строки из файлов, вывести количество совпадений
есть два файла txt файл 1: 15 000 000 строк по 15 символов файл2: 200 000 строк по 15 символов.


Построчно сравнить два текстовых файла и вывести строки, которых нет или отличаются
Есть 2 текстовых файла, необходимо их построчно сравнить и вывести строки которых нет или.

Сравнить числа массива РПД из 10-ти элементов, с содержимым R5, посчитать количество совпадений
Сравнить числа массива РПД из 10-ти элементов, с содержимым R5, посчитать количество совпадений.

Бинарные, как и текстовые, состоят из тех же нулей и единиц, что и текстовые. Да и сравнивать побайтно же будешь. Или побитно?

По байтно, скажем стоит значение в одном файле F4 и в другом F4, значит всё окей, не совпадений нет. А если F3 и F4 , есть одно не совпадение и так далее.

Текстовые файлы , это не то совсем, пробовал не работает.

Прога моя, по нажатию кнопки загрузить, загружает первый файл, потом второй , обрабатывает два файла , подсчитывает размер , Checksum (обоих файлов) и выводит, теперь осталось сделать одну операцию, чтоб проверяла на совпадение, или не совпадение, лучше по байтно думаю. Чем проще, тем лучше.

Да загружается и обрабатывается так :

Решение

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

Да они оба загружаются в разные буферы + в цикле подсчёт Checksum.
Как ещё в цикле реализовать сравнение по байтно ?

Всё же, если можно, то кодом покажите ?
Лучше один раз увидеть, чем сто раз услышать, так гласит поговорка и думаю это точное определение.

Всем добрый вечер !

В продолжении темы, сравнение файлов и вывод количества несовпадений,
удалось построить конструкцию подсчёта.
Но с такой конструкцией точно подсчитываются несовпадения, если файлы равны и имеют одинаковый размер.
Правда бывает , что и с большими файлами корректно подсчитывает, но часто выпадает в ошибку.
Данный код, я так понимаю, что расчитан на одинаковую длину, размер файлов.
Отсюда прошу помощи, как построить конструкцию, корректно работающую, с файлами разной длины, размера?

YuryK Спасибо !
Я буквально часа 2 назад свой код нацарапал и всё вроде отлично,
но вот засада одна , как заноза, сверяю 2 файла, оба в 167 байт, одинаковые
по размеру, программа моя показывает 64 несовпадения,
Загоняю в HEX редактор, там 63 несовпадения.
В этих файлах в 167 байт, последние строки не полные , все по 16, а последние строки по 7.
Получается, что что то со смещением.
С большими файлами на отлично, всё коррекно мой код, единственное но, загружать надо первым файлом, тот, который больше по размеру иначе несовпадений больше получается.
А так, как загружаются оба файла, по клику одной кнопке, (один, потом, следом второй),
вот сижу сейчас думаю, как оусловие поставить так, чтоб корректен вывод был, в любой последовательности,
первый ли меньше, второй больше, или на оборот.

С Вашем кодом тоже файлы в 167 байт на один в + и тоже 64, а не 63.
С большими файлами Ваш код некорректно подсчитывает, при чём, не важно , в какой последовательности.

Если ставлю условие на файлы в 167 байт, с неполной последней строкой, то начинает дурить с большими файлами.

Сижу пока не нашёл решение, думаю что то с неполной строкой в файле , либо сог смещением что то.
Но думаю , что с неполной строкой в файле проблема ?

Если 5-10 строк - то с этим как то можно мирится. Но если 1000-1500. Каждый раз нажимать на "Закрыть" что бы осуществилась одна проверка и увидеть одно совпадение или несовпадение - геморно как то. Помогите!


Как сравнить два текстовых файла?
Необходимо сравнить два текстовых файла с помощью очереди. Может, у кого есть такая программа в.


Сравнить два бинарных файла и вывести в label количество не совпадений, или что нет не совпадений
Добрый день ! Прошу помощи в реализации задачи. В программе нужно сравнить два файла (разной.

Сравнить два списка
Есть два списка(две матрицы 5х4) L1 и L2, которые сгенерированы рандомно Нужно сравнить два этих.

Сравнить два Bitmap
Нужно сравнить между собой два bitmap, размер которых одинаковый. По-пиксельно слишком долго.

Добавлено через 1 час 20 минут
Второй вопрос по вышеприведенной прожке. В ней вот этот код.

if xls_to_stringgrid(stringgrid1, 'D:\Progs\Sravnilka\ГЕЛИОС.xls') then
showmessage('Табица успешно загружена!');

Как реализовать что бы не нужно было прописывать полный путь к файлу 'D:\Progs\Sravnilka\ГЕЛИОС.xls', а допустим чтобы выбирался файл находяшийся в одной директории с программой '\ГЕЛИОС.xls' - не видит файла. Или как реализовать выбор файла через OpenDialog?

Добавлено через 35 минут
Прошу прощения. Уже сам разобрался.

Добавлено через 25 минут
Терь точно вопрос которого не знаю.
Как сделать что бы в Мемо выводилась не одна ячейка, а вся строка.
А еще лучше если всю строку перенести не в Мемо а в StringGrid


Сравнить два Memo построчно
друзья нужна помощь, в мемо написанные циферки больше 9. программа воспринимает как однозначную и.

Сравнить два списка Datetime
Доброе время суток! Ошибка в цикле, совсем запутался) В итоговый список выводит слишком много.


Как сравнить два массива и распечатать их?
Здравствуйте, недавно начал изучать delphi, есть вопрос как сранить элементы двух массивов? if.

Как сравнить два числа с плавающей запятой?
Хотел сделать проверку обновления в программе используя Synapse. Но при сравнении двух чисел.

__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.

Хочу добавить, что задачу по сравнению очень больших текстовых файлов решать лучше с помощью Memory Mapped Files и сравнивать файлы побайтово (если ASCII кодировка и по два байта, если Unicode). Указанный выше способ большие файлы будет сравнивать очень долго и в StringList можно загрузить только 2Gb, а если процесс 32 битный, то получаем, грубо говоря, что можно сравнить два файла суммарный размер которых не более 2Gb.

__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.

. Указанный выше способ большие файлы будет сравнивать очень долго и в StringList можно загрузить только 2Gb.

2Gb в текстовом файле, оригинально. Есть другие, более подходящие для этого носители, а здесь на такие размеры нет даже намека, так что, прокатит вполне

Не ради наезда написал это, и дело не в том, что такая задача не была поставлена. Я сам не далеко ушел от новичка и в самом начале мне бы была полезна подобная информация, ею и поделился. Собственно, поэтому и написал Memory Mapped Files чтобы те, кому интересно, могли погуглить в целях общего развития.

Не ради наезда написал это, и дело не в том, что такая задача не была поставлена. Я сам не далеко ушел от новичка и в самом начале мне бы была полезна подобная информация, ею и поделился. Собственно, поэтому и написал Memory Mapped Files чтобы те, кому интересно, могли погуглить в целях общего развития.

Не сильно поможет. Все равно надо будет один из них загрузить в память. Если файлы действительно большие, то надо их отсортировать. Вот тогда можно обойтись малым объемом памяти. Хотя на диске все-равно будет много места занято, т.к. проидется создавать третий файл, содержащий результат.

А для маленьких файлов Alegun был на правльном пути. Вот мой вариант:


Вопрос новичка. Имеется 2 файла dbf. Первый имеет раздельные поля фамилия, имя, отчество, дата рождения, текст большими буквами. Второй - фамилия имя отчество и дата рождения в одном поле, текст - Первая -заглавная, остальные маленькие. Требуется сравнить и создать отчеты кого нет в 1 и кого нет во втором.

1) порядок записей в файлах имеет значение?

2) ФИО + дата рождения могут не дать 100% уникальности (впрочем, вероятность этого низкая, но всё же. )

3) почему именно Delphi выбрано в качестве инструмента обработки? И ещё, важно, через что собираетесь работать с DBF файлами? Есть возможность использовать бесплатный Microsoft OLE DB Provider for Visual FoxPro ? (его нужно будет поставить на том компьютере, где будет производится обработка данных. )

4) отчёт нужно получить в каком виде? в каком формате?

5) На какую помощь Вы рассчитываете? Что конкретно не получается?
Дело в том, при некоторых удачных ответах на первые мои вопросы, возможно, я набросаю Вам такую программку (люблю простые и незамысловатые утилитки по обработке данных).

1. Записи в файлах отсортированы по алфавиту, в выходных файлах порядок неважен.
2. Дата рождения при поиске не учитывается, как думаю использовать переменную фамилия+имя+отчество, если 100% вхождение в поле 2 файла, то переменную заносим в файл, обнуляем, переходим к следующей записи. Что-то вроде таким образом.
3. Delphi выбран, т.к. для меня проще написать на нем, чем на С++. Использование OLE DB возможно.
4. Отчет можно в текстовом формате или в виде DBF, не критично, важен результат.
5. Запутался да и не силен в обработке БД.

Delphi выбран, т.к. для меня проще написать на нем, чем на С++. Использование OLE DB возможно.

Задача постоянная -сверять списки получателей пенсии. Есть программа написанная на фоксе, но работает настолько криво, что ужас. Приходится конвертировать из csv в dbf, в dbf в поле приплюсовывать "г." (непонятные условия программы) и потом сравнивать. Уходит масса времени и есть желание написать программу и не волноваться за полученный результат что кого-то пропустил.

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

Вы что, никогда не сталивались с полными тёзками? У совершенно разных людей могут совпасть не только имя+отчество (это вообще очень часто) но и фамилия!
Если уже есть правильно заполненное поле с датой рождения, то почему бы не задействовать дату рождения?

Кстати - да! Если это нужно один раз сделать - то зачем городить огород с программой, когда парой запросов проблему можно прямо в командном окошке FoxPro решить.
Да и EXEшничек на FoxPro можно сварганить! Могу посодействовать!

увидел Ваш пост. Понял, что задача не разовая.
Но Вы зря на FoxPro грешите - то, что у программиста, написавшего программу были кривоватые ручки,
не бросает тень на сам FoxPro


p.s. И выложите в архиве пару DBF файлов (структура ОБЯЗАТЕЛЬНО должна быть такая же, как в исходных файлах. Заполнение - должно ОБЯЗАТЕЛЬНО соответствовать исходным файлам. Содержимое - на Ваш вкус (Иванов Иван Иванович, Сидоров Сидор Сидорович и т.д.)

Читайте также: