Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2011, 14:12   #1
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию Сравнить два файла

Помогите пожалуйста сравнить два файла по колонке Инд.код
Необходимо что бы прога сравнила значения в колонке Инд.код и вывела в Memo или в отдельный файл Excel совпавшие значения.
Я понимаю что это осуществляется как то с помощью for to do но как не пойму вообще.
Вложения
Тип файла: rar tab.rar (3.8 Кб, 12 просмотров)
Смотреть фильмы HD Фильмы для планшетов
demiancz вне форума Ответить с цитированием
Старый 13.02.2011, 15:16   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Ты умеешь работать в Делфи с Экзелем?
Если нет рекомендую:
1) Корняков В.Н. «Программирование документов и приложений MS Office в Delphi»
2) http://www.programmersforum.ru/showthread.php?t=125874 (Это для размышлений)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.02.2011, 16:28   #3
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

Корняков В.Н. «Программирование документов и приложений MS Office в Delphi» - прочитал. Там подобной темы нет. Вписать, заменить, сохранить текст - это понятно. А сама процедура проверки наличия совпадений? Это может не только Экселя касаться. Допустим если бы у нас был текстовый файл (2 текстовых файла). Как их сравнить и вывести совпадения в Memo. Меня интересует сам принцип реализации.
Смотреть фильмы HD Фильмы для планшетов
demiancz вне форума Ответить с цитированием
Старый 13.02.2011, 19:54   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

если только принцип, покажу на StringGrid, думаю поимеш
Код:
for i := 0 to StringGrrid1.ColCount - 1 do
  for j := 0 to StringGrid1.RowCount - 1 do
    if StringGrid1.Cells[i, j] = StringGrid2.Cells[i, j] then Memo1.Lines.Add(StringGrid1.Cells[i, j])
      esle Memo2.Lines.Add(StringGrid1.Cells[i, j])
проверяем по ячеично, если совпадают значения заносим в Мемо1, если не совпадают в Мемо2
Код:
A := False;
for i := 0 to StringGrrid1.ColCount - 1 do
  for j := 0 to StringGrid1.RowCount - 1 do
    if StringGrid1.Cells[i, j] <> StringGrid2.Cells[i, j] then
    begin
      A := True;
      Memo1.Lines.Add('в таблицах есть различия')
      Memo1.Lines.Add(StringGrid1.Cells[i, j] + '<>' + StringGrid2.Cells[i, j])
    end;
if A = False then ShowMessage('отличии нет');
сравниваюца все ячеики и те которые различны, если такие есть, заносяца в Мемо1,
если все одинаково, то выходит сообшение, 'отличии нет'
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 14.02.2011, 16:17   #5
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

Что то не так.
Попробовал вот такой код:
Цитата:
unit Unit1;

interface

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;

implementation

uses Unit2;

{$R *.dfm}

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;

end.
Получается проверка до первого несовпадения. А остальное не проверяет.
Выводит:
Цитата:
Присутствуют и в первом и во втором списке
111111111111110
111111111111111
111111111111112
111111111111113
Цитата:
Отсутствуе во втором списке
111111111111115
А должно быть
Присутствуют и в первом и во втором списке
111111111111110
111111111111111
111111111111112
111111111111113
111111111111114

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


Помогите решить задачу. Исходник прилагается.
Вложения
Тип файла: rar proba.rar (217.2 Кб, 19 просмотров)
Смотреть фильмы HD Фильмы для планшетов
demiancz вне форума Ответить с цитированием
Старый 14.02.2011, 16:28   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

мои способы показывали сравнение у таблич равных размеров.
вам надо только первые столбики сравнить?

вот:
Код:
  A := False;
  for i := 0 to StringGrid1.RowCount - 1 do
  begin
    for j := 0 to StringGrid2.RowCount - 1 do
      if StringGrid1.Cells[0, i] = StringGrid2.Cells[0, j] then A := True;
    if A = True then Memo1.Lines.Add(StringGrid1.Cells[0, i])
      else Memo2.Lines.Add(StringGrid1.Cells[0, i]);
    A := False;
  end;
но учтите, если во второи таблице есть что то чего нет в первои оно никуда не попадет
что б наити рти значения нужно зделать тоже самое только местами таблич поменять
VirusN13

Последний раз редактировалось ArtGrek; 14.02.2011 в 16:51.
ArtGrek вне форума Ответить с цитированием
Старый 14.02.2011, 17:21   #7
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

Работает правильно. НО! Что бы осуществился выбор карточки необходимо нажать на закрытие формы 2. после каждого нажатия в Мемо добавляются значения. В чем глюк?
Цитата:
var
i:integer;
A : boolean;
j:integer;
begin
A := False;
for i := 0 to StringGrid1.RowCount - 1 do
begin
for j := 0 to StringGrid2.RowCount - 1 do
if StringGrid1.Cells[0, i] = StringGrid2.Cells[0, j] then A := True;
if A = True then Form2.Memo1.Lines.Add(StringGrid1.C ells[0, i])
else Form2.Memo2.Lines.Add(StringGrid1.C ells[0, i]);
A := False;
Form2.ShowModal;
end;

end;
Смотреть фильмы HD Фильмы для планшетов
demiancz вне форума Ответить с цитированием
Старый 14.02.2011, 17:27   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

Цитата:
Что бы осуществился выбор карточки необходимо нажать на закрытие формы 2. после каждого нажатия в Мемо добавляются значения.
вот ето поясни
как происходит процесс?
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 14.02.2011, 18:08   #9
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

При нажатии на кнопку "Проверить" открывается вторая форма. В Мемо такой результат
Цитата:
Присутствуют и в первом и во втором списке
111111111111110
Потом нажимаю на "Закрыть". Форма2 не закрывается, а появляется такой результат
Цитата:
Присутствуют и в первом и во втором списке
111111111111110
111111111111111
И так до окончания проверки пока не станет
Цитата:
Присутствуют и в первом и во втором списке
111111111111110
111111111111111
111111111111112
111111111111113
111111111111114
Цитата:
Отсутствуе во втором списке
111111111111115
111111111111123
111111111111125
111111456879521
только после этого Форма2 закрывается.

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

Все решил проблему.
Смотреть фильмы HD Фильмы для планшетов

Последний раз редактировалось artemavd; 16.02.2011 в 03:12.
demiancz вне форума Ответить с цитированием
Старый 14.02.2011, 22:44   #10
demiancz
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 246
По умолчанию

Второй вопрос по вышеприведенной прожке. В ней вот этот код.
Цитата:
if xls_to_stringgrid(stringgrid1, 'D:\Progs\Sravnilka\ГЕЛИОС.xls') then
showmessage('Табица успешно загружена!');
Как реализовать что бы не нужно было прописывать полный путь к файлу 'D:\Progs\Sravnilka\ГЕЛИОС.xls', а допустим чтобы выбирался файл находяшийся в одной директории с программой. Если прописать в коде '\ГЕЛИОС.xls' - то не видит файла. Или как реализовать выбор файла через OpenDialog?

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

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

Последний раз редактировалось artemavd; 16.02.2011 в 03:10.
demiancz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц, летом дешевле!

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнить два текстовых файла assch Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 17 29.09.2010 14:41
Как быстро сравнить два похожих файла? myza Microsoft Office Excel 8 26.08.2010 08:59
Сравнить два множества. Pascal MaxMelnikov Помощь студентам 3 16.03.2009 09:35
как в перле можно сравнить два файла? menik Помощь студентам 1 23.02.2009 10:16
Сравнить два файла Aleksandr Microsoft Office Excel 6 07.10.2008 00:22