powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сравнение 2 файлов (.xlsx) посредством Delphi
55 сообщений из 55, показаны все 3 страниц
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845237
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Задача такая, имеется 2 Excel файла с расширением .xlsx. Необходимо узнать имеется ли каждая запись первого файла во втором. В каждом файле порядка 8000 строк. Если сравнитьвать посредством OLE получается долго. Куда копать, как быть? Сильно не ругайте, новичок.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845239
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan Если сравнитьвать посредством OLE получается долго. Куда копать, как быть?

Зависит от того, как через ОЛЕ работаете: если через Cells, это одно, а если через Range и все равно медленно, это другое.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845241
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Получаю данные с ексель в массив, загружаю в StringGrid. Дальше в счетчиком по строчно проверяю..
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845243
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx1ca4064,

Получаю данные с ексель в массив

Эту часть можно реализовать через Cells (пробегая в цикле) или через Range (сразу вариантный массив)
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845244
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может есть какая то возможность запихать данные во временную таблицу и уже по этой таблице SQL запросами найти что есть, чего нет?
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845245
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Пример можно, если есть? Хотя бы кусок. Буду благодарен!
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845248
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx
Пример можно, если есть? Хотя бы кусок. Буду благодарен!

Все говорят "буду..." :) Готового примера нет (точнее есть,но большой), могу подсказать, что изменить в Вашем коде.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845256
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for I:= 8 to StringGrid1.RowCount do
begin
for J:= 7 to StringGrid2 do
begin
if AnsiCompareText(StringGrid1.Cells[11, i], StringGrid2.Cells[3, j] = 0) then
begin
 // выполняем действия
break;
end;
end;
end;
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845257
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Molchanx1ca4064,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for I:= 8 to StringGrid1.RowCount do
begin
for J:= 7 to StringGrid2 do
begin
if AnsiCompareText(StringGrid1.Cells[11, i], StringGrid2.Cells[3, j] = 0) then
begin
 // выполняем действия
break;
end;
end;
end;



for J:= 7 to StringGrid2.RowCount do
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845259
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx1ca4064,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
for I:= 8 to StringGrid1.RowCount do
begin
for J:= 7 to StringGrid2 do
begin
if AnsiCompareText(StringGrid1.Cells[11, i], StringGrid2.Cells[3, j] = 0) then
begin
 // выполняем действия
break;
end;
end;
end;



Короче, кода нет. У Вас скорее всего, тормоза в 2 местах:
1. Получение данных - там поможет Range
2. Поиск данных - там поможет сортировка
2.5 ну и данные храните в массиве, а не в гриде.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845261
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

1. Данные так и есть, получаю в массив.\
2. По поводу сортировки, можете поподробней?
3. Понял, не буду грузить в грид.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845265
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx1ca4064,
2. По поводу сортировки, можете поподробней?


Вы решаете такую задачу: для каждой строки из Массива1 ищете, есть ли такая же в Массиве2. В текущей реализации для поска в Массиве2 Вы его просматриваете полностью (8000 операций, грубо), а если Массив2 отсортировать, можно будет использовать двоичный поиск (13 операций, примерно).
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845268
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Тяжело без примера :( Полезу в help..
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845269
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanx1ca4064,

Тяжело без примера :( Полезу в help..

Посмотрите TList, TStringList. У меня осталось подозрение, что тормоза могут быть и в части получения данных: проверьте скорость работы без поиска строк. С другой стороны, отсортировать можно и в Excel :)
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845270
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Занимался когда то такой ерундой, но плюнул. Задача идиотская.

сырцы:

Код: pascal
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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
{$APPTYPE CONSOLE}

program SheetsCompare;

uses
  ActiveX, Classes, ComObj, Mainunit, SysUtils, Variants;

const
  cVector: array [0..3] of Char = (
    '?', '-', '|', '\');
    
type
  TVector = (vUnd, vRow, vCol, vRnC);

  TSheetRec = record
    fFileName: string;
    fSheetName: string;
    fRow: Integer;
    fCol: Integer;
    fVector: TVector;
    fBreakFlag: string;

    fList: TStringList;
    fError: string;
  end;

  TSheetsCompare = class(TObject)
  private
    { Private declarations }
    fMainList: TStringList;
    fResultList: TStringList;

    fSheets: array of TSheetRec;

    function LoadSheetCalc(const ASheetRec: TSheetRec): Boolean;
    function LoadSheetExcel(const ASheetRec: TSheetRec): Boolean;

    function CompareSheets: Boolean;
    function ParseParams: Boolean;
  public
    { Public declarations }
    constructor Create;
    destructor Destroy; override;

  end;

var
  hSheetsCompare: TSheetsCompare;

{ TSheetsCompare }

{ Private declarations }

function TSheetsCompare.LoadSheetCalc(const ASheetRec: TSheetRec): Boolean;
begin
  Result := False;

end;

function TSheetsCompare.LoadSheetExcel(const ASheetRec: TSheetRec): Boolean;
var
  vExcel: Variant;
  vSheet: Variant;

  sBuffer: string;

  iRow: Integer;
  iCol: Integer;

begin
  Result := False;

  vExcel := CreateOleObject('Excel.Application');
  try
    with ASheetRec do
      if FileExists(fFileName) then
        begin
          vExcel.WorkBooks.Open(FileName := fFileName, ReadOnly := True);

          vSheet := vExcel.ActiveWorkBook.ActiveSheet;

          iRow := fRow; iCol := fCol;
          sBuffer := vSheet.Cells[iRow, iCol];

          if fVector <> vUnd then
            while Trim(sBuffer) <> fBreakFlag do
              begin
                fMainList.Add(sBuffer);
                fList.Add(sBuffer);

                if fVector = vRow then
                  Inc(iRow);

                if fVector = vCol then
                  Inc(iCol);

                if fVector = vRnC then
                  begin
                    Inc(iRow);
                    Inc(iCol);
                  end;

                sBuffer := vSheet.Cells[iRow, iCol];
              end;

          vSheet := Unassigned;

          vExcel.WorkBooks.Close;
        end
      else
        fResultList.Add(Concat('File: "', fFileName, '" not found'));

  finally
    vExcel.Quit;
    vExcel := Unassigned;

  end;

end;

function TSheetsCompare.CompareSheets: Boolean;
var
  bError: Boolean;

  pCount: Integer;
  iCount: Integer;

  sBuffer: string;

  iResult: Integer;

  sResult: Char;

begin
  Result := False;

  for pCount := 0 to ParamCount - 1 do
    LoadSheetExcel(fSheets[pCount]);

  with fMainList do
    for iCount := 0 to Count - 1 do
      begin
        Result := True;

        sBuffer := Concat('Value: <', Strings[iCount], '>');;
        for pCount := 0 to ParamCount - 1 do
          with fSheets[pCount] do
            begin
              bError := not fList.Find(Strings[iCount], iResult);
              if bError then
                begin
                  sResult := 'Н';
                  Result := False;
                end
              else
                sResult := 'Д';

              sBuffer := Concat(sBuffer, #9, sResult);
            end;

        if not Result then           
          fResultList.Add(sBuffer);
      end;
end;

function TSheetsCompare.ParseParams: Boolean;
var
  pCount: Integer;

begin
  Result := True;

  for pCount := 0 to ParamCount - 1 do
    with fSheets[pCount] do
      begin
        Writeln(Concat('File name:', #9, fFileName));
        Writeln(Concat('Sheet name:', #9, fSheetName));
        Writeln(Concat('Row:', #9, IntToStr(fRow)));
        Writeln(Concat('Col:', #9, IntToStr(fCol)));
        Writeln(Concat('Vector:', #9, cVector[Integer(fVector)]));
        Writeln(Concat('Flag:', #9, fBreakFlag));
      end;

end;

{ Public declarations }

constructor TSheetsCompare.Create;
var
  iCount: Integer;
  sBuffer: string;

begin
  inherited Create;

  SetLength(fSheets, ParamCount);

  for iCount := 1 to ParamCount do
    with fSheets[iCount - 1] do
      begin
        fFileName := ExtractWord(1, ParamStr(iCount), ['#']);
        fSheetName := ExtractWord(2, ParamStr(iCount), ['#']);

        fRow := StrToIntDef(ExtractWord(3, ParamStr(iCount), ['#']), -1);
        fCol := StrToIntDef(ExtractWord(4, ParamStr(iCount), ['#']), -1);

        fVector := vUnd;
        
        sBuffer := ExtractWord(5, ParamStr(iCount), ['#']);
        sBuffer := AnsiUpperCase(sBuffer);

        if sBuffer = 'ROW' then
          fVector := vRow;
        if sBuffer = 'COL' then
          fVector := vCol;
        if sBuffer = 'RNC' then
          fVector := vRnC;

        fBreakFlag := ExtractWord(6, ParamStr(iCount), ['#']);

        fList := TStringList.Create;
        fList.Sorted := True;
      end;

  fMainList := TStringList.Create;
  with fMainList do
    begin
      Sorted := True;
      Duplicates := dupIgnore;
    end;

  fResultList := TStringList.Create;
end;

destructor TSheetsCompare.Destroy;
var
  iCount: Integer;

begin
  with fResultList do
    begin
      SaveToFile('SheetsCompare.log');
      Free;
    end;

  fMainList.Free;

  for iCount := 0 to ParamCount - 1 do
    with fSheets[iCount] do
      fList.Free;

  SetLength(fSheets, 0);

  inherited Destroy;
end;

begin
  CoInitialize(nil);

  if ParamCount > 1 then
    begin
      hSheetsCompare := TSheetsCompare.Create;
      with hSheetsCompare do
        try
          if ParseParams then
            CompareSheets;

        finally
          Free;

        end;
    end
  else
    begin
      Writeln('Error: Params count mismatch');

    end;

  CoUninitialize;
end.




мануал:

Программа для сравнения произвольных *.xls файлов. Сравнивает в длинну, ширину и глубину. Альфа.

Параметры запуска:

SheetsCompare.exe C:\SheetsCompare\Data\Journal1.xls#Лист1#2#2#Row# C:\SheetsCompare\Data\Journal2.xls#Лист1#2#3#Col# C:\SheetsCompare\Data\Journal3.xls#Лист1#1#1#RnC#654

C:\SheetsCompare\Data\Journal1.xls# - полный путь к файлу
Лист1# - имя листа (не работает)
2# - строка
2# - столбец
Row# - вектор данных (Row - вниз, Col - вправо, RnC - правониз (диагональ по чухонски),
неопознанный вектор устанавливается в Und(efined) программа возьмет только данные стартовой ячейки)
Конец - флаг остановки (если не указать этот параметр, прога остановится на первой пустой ячейке,
а если указать, но прога его не найдет - вылетит бряк. (щёчик прикрутить штоле...))

Протокол выпадет в *.log файл.

Туду:

Доработать выбор листа: "Лист1" (пока отрабатывает только первый лист), добавить обработку *.odt, отвязатся от excel`я.


Написано на коленке под острой интоксикацией коньяком. Не обессудь.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845272
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
x1ca4064,

Получение данных происходит быстро.. Пользователь не будет сам сортировать, выгружаю в Excel и прога должна сразу обработать...
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845273
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LocksmithPC,

Спасибо.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845283
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
MolchanДобрый день. Задача такая, имеется 2 Excel файла с расширением .xlsx. Необходимо узнать имеется ли каждая запись первого файла во втором. В каждом файле порядка 8000 строк. Если сравнитьвать посредством OLE получается долго. Куда копать, как быть? Сильно не ругайте, новичок.

Подобную задачу проще решить родными средствами Excel - скриптами
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845284
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolchanПолучаю данные с ексель в массив, загружаю в StringGrid. Дальше в счетчиком по строчно проверяю..
"Твою ж мать..." - (с)
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845295
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Если бы нужно было просто сравнить, то не написал бы в этой ветке..
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845299
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Molchandefecator,

Если бы нужно было просто сравнить, то не написал бы в этой ветке..

написано в первом посте, что
Molchanимеется 2 Excel файла с расширением .xlsx. Необходимо узнать имеется ли каждая запись первого файла во втором.

и больше ничего иного
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845308
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YouTube Video
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845319
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan,

пробегаешься по первой табличке, берешь текстовое представление каждой строки, помещаешь его в словарь. В качестве ключа используешь строку, в качестве значения - "ничего".

Затем пробегаешься по второй табличке, также берешь текстовое представление каждой строки и проверяешь наличие ее в словаре.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845322
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Ветка то Delphi, думаю говорит само за себя.. Долой разговоры:) По делу подсказать сможешь что?
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845324
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan...

Какой из предложенных способов ты выбрал?
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845339
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Molchandefecator,

Ветка то Delphi, думаю говорит само за себя.. Долой разговоры:) По делу подсказать сможешь что?
Не зная всей задачи, могу только ещё раз предложить описанное сделать средствами самого Excel
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845349
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё,

Копаю в сторону массивов..
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845355
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а пра чо топег?
а хто аффтар?

(С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845374
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanёёёёё,

Копаю в сторону массивов..
Каких нах.. массивов?
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845375
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёёMolchanёёёёё,

Копаю в сторону массивов..
Каких нах.. массивов?

как подсказал x1ca4064
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845378
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan,

ну, копай. Солнце еще высоко.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845379
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё,

У кого как..
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845381
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DiffEngineX
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845389
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёMolchan,

пробегаешься по первой табличке, берешь текстовое представление каждой строки, помещаешь его в словарь. В качестве ключа используешь строку, в качестве значения - "ничего".

Затем пробегаешься по второй табличке, также берешь текстовое представление каждой строки и проверяешь наличие ее в словаре.
Только если надо не учитывать регистр при сравнении, то приводить все склеенные строки к единому регистру.
А так плюсую, процедуры умножения множеств на строках и таких объемах надо делать через хеши
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845421
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Василий 2,

А можно поподробней? как реализовать
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845425
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchan...А можно поподробней? как реализовать
Что именно "поподробней", конкретно.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845429
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё,

я так понял что, берем колонку первой таблицы которую надо сравнить, грузим в память. Потом каждое значение проверяем есть ли в памяти? Верно?
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845434
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanёёёёё,

я так понял что, берем колонку первой таблицы которую надо сравнить, грузим в память. Потом каждое значение проверяем есть ли в памяти? Верно?

Где тут слово "колонка" и "грузим в память":

ёёёёёMolchan,

пробегаешься по первой табличке, берешь текстовое представление каждой строки, помещаешь его в словарь. В качестве ключа используешь строку, в качестве значения - "ничего".

Затем пробегаешься по второй табличке, также берешь текстовое представление каждой строки и проверяешь наличие ее в словаре.
- ???
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845436
Molchan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё,

Можешь подробно объяснить?! Не все такие крутые программисты как ты, сказал же, что я недавно начал только программировать на делфи...
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845461
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.08.2019 15:42, Molchan пишет:
> Можешь подробно объяснить?! Не все такие крутые программисты как ты, сказал же, что я недавно начал только программировать на делфи...

зачем?
есть готовое решение.
я тебе уже сказал как оно называется.

зы: обучаю аппендэктомии (trans tonsils) по переписке.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845465
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Molchanёёёёё,

Можешь подробно объяснить?! Не все такие крутые программисты как ты, сказал же, что я недавно начал только программировать на делфи...

1. Открываем первую табличку.
2. Построчно из первой таблички заносим данные в структуру, которая позволяет быстро-быстро найти строку. Так как ты про словари не слышал, используем, например, сортированный TStringList.
3. Открываем вторую табличку. Построчно проверяем наличие данных в структуре TStringList.

Важно: преобразование строки таблички в строку Delphi (string). Как это делать - знаешь только ты. Например, нужно учитывать формат, или пустые ячейки и т.д.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var
  fSL: TStringList;
  fUR: OleVariant;
begin
  memMain.Lines.Clear;
  if not FileSExist([edFName1.Text, edFName2.Text]) then Exit;
  fSL := TStringList.Create;
  try
    LoadData(fSL, edFName1.Text); // Загрузка данных из первой таблички
    fSL.Sorted := True;
    fSL.Duplicates := dupIgnore;
    TestData(fSL, edFName2.Text); // Проверка данных
  finally
    fSL.Free
  end;
end;
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845467
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загрузка данных:

Код: pascal
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.
var
  fEXL: OleVariant;
  fRow: OleVariant;
  fStrCell: string;
  fStrRow: string;
  fUR: OleVariant;
  fWS: OleVariant;
  i: Integer;
  j: Integer;
begin
  fEXL := CreateOleObject('Excel.Application');
  fEXL.Visible := False;
  fEXL.Workbooks.Open(aFileName);
  fWS := fEXL.Worksheets[1];
  fUR := fWS.UsedRange;
  for i := fUR.Row to fUR.Rows.Count do begin
    fStrRow := '';
    fRow := fUR.Rows[i];
    for j := fRow.Column to fRow.Columns.Count do begin // Следующие две строки определяют, какие данные для тебя важны для сравнения
      fStrCell := fRow.Columns[j].Text;
      fStrRow := fStrRow + '|' + QuotedStr(fStrCell);
    end;
    aSL.Add(fStrRow);
  end;
  fEXL.Quit;
  fEXL := Unassigned;
end;
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845468
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверка данных:

Код: pascal
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.
var
  fEXL: OleVariant;
  fRow: OleVariant;
  fStrRow: string;
  fUR: OleVariant;
  fWS: OleVariant;
  i: Integer;
  j: Integer;
begin

  fEXL := CreateOleObject('Excel.Application');
  fEXL.Visible := False;
  fEXL.Workbooks.Open(aFN);
  fWS := fEXL.Worksheets[1];
  fUR := fWS.UsedRange;
  for i := fUR.Row to fUR.Rows.Count do begin
    fStrRow := '';
    fRow := fUR.Rows[i];
    for j := fRow.Column to fRow.Columns.Count do
      fStrRow := fStrRow + '|' + QuotedStr(fRow.Columns[j].Text); // Анал огично.

    if aSL.IndexOf(fStrRow) >= 0 then
      memMain.Lines.Add(Format('data exists, row=%d', [i]))

  end;

  fEXL.Quit;
  fEXL := Unassigned;

end;
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845469
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проект.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845470
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование TStringList чревато засиранием памяти в случае огромного исходного файла. Поэтому следует использовать словари, которые не хранят исходный ключ.
Сортировать TStringList лучше (по скорости) перед проверкой данных.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845474
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
05.08.2019 17:01, ёёёёё пишет:
> Использование TStringList чревато засиранием памяти в случае огромного исходного файла.
> Поэтому следует использовать словари, которые не хранят исходный ключ.
> Сортировать TStringList лучше (по скорости) перед проверкой данных.

"папа, а ты с кем сейчас разговаривал?" (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845541
figli
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нафига дельфи? можно или через сам эксель на ВБ проверить, или еще проще(если знаком с mssql) написать один запрос через OPENQUERY
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845560
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
figli,

Не трогай сиквел!
Пусть в Аксес валит,
если Екселя не хватит.
Задача мелковата.
Дельфя тут не причём!
И все две станицы - вата.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845619
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
figliнафига дельфи? можно или через сам эксель на ВБ проверить, или еще проще(если знаком с mssql) написать один запрос через OPENQUERY
Кто его знает какие, какие критерии сравнения.
Какие настройки безопасности - может, доступ к vba заарыт намертво.
Может, тс вообще все наврал.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845656
Фотография Мигалка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё можно через адо. в дельфе не делал, а вот в вба
Код: vbnet
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.
    Dim sCon$, cn As Object
    Dim finalRow&, lCount&, sSQL$
    Set cn = CreateObject("ADODB.Connection")
    cn.Mode = adModeReadWrite
    Select Case CLng(Split(Application.Version, ".")(0))
    Case Is < 12
        sCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ThisWorkbook.FullName _
             & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
    Case Is >= 12
        sCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName _
             & ";Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1"";"
    End Select

    cn.Open sCon
                                           
    Dim SheetResult As Worksheet
    Dim SRName As String
    SRName = "Результат"
    If Sh_Exist(ActiveWorkbook, SRName) Then
      Set SheetResult = ActiveWorkbook.Sheets(SRName)
      SheetResult.Delete
    End If
    Set SheetResult = ActiveWorkbook.Sheets.Add(, ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count))
    SheetResult.Name = SRName
    
    Dim rs02 As Object

    sSQL = "SELECT " _
         & "  [Фамилия Имя Отчество], [ИНН-КПП], [Дата регистрации], " _
         & "  instr([Фамилия Имя Отчество], ' ') as frst, " _
         & "  instr(mid([Фамилия Имя Отчество],instr([Фамилия Имя Отчество], ' ')+1,100), ' ') as scnd, " _
         & "  instr([ИНН-КПП], '-') as innkpp, " _
         & "  instr([Дата регистрации], '.') as dd,  " _
         & "  instr(mid([Дата регистрации],instr([Дата регистрации], '.')+1,100), '.') as mm " _
         & "FROM [Список А$]"
    Set rs02 = cn.Execute(sSQL)
    With SheetResult
        .Cells(2, 1).CopyFromRecordset rs02
        .Cells(1, 1).Value = "Фамилия Имя Отчество"
        .Cells(1, 2).Value = "ИНН-КПП"
        .Cells(1, 3).Value = "Дата регистрации"
        .Cells(1, 4).Value = "frst"
        .Cells(1, 5).Value = "scnd"
        .Cells(1, 6).Value = "innkpp"
        .Cells(1, 7).Value = "dd"
        .Cells(1, 8).Value = "mm"
    End With
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845701
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно, а у memorydataset'ов насколько быстрая сортировка и фильтрация?
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845723
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докинтересно, а у memorydataset'ов насколько быстрая сортировка и фильтрация?
Странный вопрос. Сколько memorydataset'ов, столько и реализаций.
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845727
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доку memorydataset'ов насколько быстрая сортировка и фильтрация?сортировка как правило просто очень быстрая :) а фильтрация может и в разы у разных реализаций отличаться. ну и даже самую скоростную можно притормозить задавая длинные и сложные фильтры
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845765
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2,
это был намек :)

vavan,
у ТС задача элементарная
...
Рейтинг: 0 / 0
Сравнение 2 файлов (.xlsx) посредством Delphi
    #39845899
Tray
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В свое время наваял на делфи прогу для сравнения файлов с использованием указателей, работает вроде довольно шустро.
два файла с 10000 строк сравнивает несколько минут (в интерфейсе юзеры выбирают столбцы, по которым будет выполняться сравнение, и столбцы, которые надо переносить из второго файла в первый при совпадении).
с тех пор юзеры от меня отстали, юзают эту прогу.

Хотя может нужны секунды, я хз что значит медленно у автора.
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сравнение 2 файлов (.xlsx) посредством Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]