Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
defecator
Member

Откуда:
Сообщений: 39308
Molchan
defecator,

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

Не зная всей задачи, могу только ещё раз предложить описанное сделать средствами самого Excel
5 авг 19, 12:23    [21942004]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 21
ёёёёё,

Копаю в сторону массивов..
5 авг 19, 12:43    [21942023]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30227

а пра чо топег?
а хто аффтар?

(С)

Posted via ActualForum NNTP Server 1.5

5 авг 19, 12:54    [21942030]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Molchan
ёёёёё,

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

Каких нах.. массивов?
5 авг 19, 13:14    [21942053]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 21
ёёёёё
Molchan
ёёёёё,

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

Каких нах.. массивов?


как подсказал x1ca4064
5 авг 19, 13:15    [21942054]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Molchan,

ну, копай. Солнце еще высоко.
5 авг 19, 13:16    [21942057]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 21
ёёёёё,

У кого как..
5 авг 19, 13:18    [21942058]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30227

DiffEngineX

Posted via ActualForum NNTP Server 1.5

5 авг 19, 13:21    [21942060]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Василий 2
Member

Откуда:
Сообщений: 679
ёёёёё
Molchan,

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

Затем пробегаешься по второй табличке, также берешь текстовое представление каждой строки и проверяешь наличие ее в словаре.

Только если надо не учитывать регистр при сравнении, то приводить все склеенные строки к единому регистру.
А так плюсую, процедуры умножения множеств на строках и таких объемах надо делать через хеши
5 авг 19, 13:45    [21942077]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 21
Василий 2,

А можно поподробней? как реализовать
5 авг 19, 15:19    [21942146]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Molchan
...А можно поподробней? как реализовать

Что именно "поподробней", конкретно.
5 авг 19, 15:22    [21942152]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 21
ёёёёё,

я так понял что, берем колонку первой таблицы которую надо сравнить, грузим в память. Потом каждое значение проверяем есть ли в памяти? Верно?
5 авг 19, 15:27    [21942159]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Molchan
ёёёёё,

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


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

ёёёёё
Molchan,

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

Затем пробегаешься по второй табличке, также берешь текстовое представление каждой строки и проверяешь наличие ее в словаре.

- ???
5 авг 19, 15:37    [21942169]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Molchan
Member

Откуда:
Сообщений: 21
ёёёёё,

Можешь подробно объяснить?! Не все такие крутые программисты как ты, сказал же, что я недавно начал только программировать на делфи...
5 авг 19, 15:42    [21942173]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30227

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

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

зы: обучаю аппендэктомии (trans tonsils) по переписке.

Posted via ActualForum NNTP Server 1.5

5 авг 19, 16:46    [21942233]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Molchan
ёёёёё,

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


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

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

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;
5 авг 19, 16:53    [21942238]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Загрузка данных:

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;
5 авг 19, 16:57    [21942241]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Проверка данных:

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;
5 авг 19, 16:58    [21942242]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Проект.

К сообщению приложен файл (tstExcel.7z - 8Kb) cкачать
5 авг 19, 16:59    [21942243]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
Использование TStringList чревато засиранием памяти в случае огромного исходного файла. Поэтому следует использовать словари, которые не хранят исходный ключ.
Сортировать TStringList лучше (по скорости) перед проверкой данных.
5 авг 19, 17:01    [21942245]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30227

05.08.2019 17:01, ёёёёё пишет:
> Использование TStringList чревато засиранием памяти в случае огромного исходного файла.
> Поэтому следует использовать словари, которые не хранят исходный ключ.
> Сортировать TStringList лучше (по скорости) перед проверкой данных.

"папа, а ты с кем сейчас разговаривал?" (С)

Posted via ActualForum NNTP Server 1.5

5 авг 19, 17:03    [21942251]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
figli
Member

Откуда:
Сообщений: 75
нафига дельфи? можно или через сам эксель на ВБ проверить, или еще проще(если знаком с mssql) написать один запрос через OPENQUERY
5 авг 19, 18:43    [21942374]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Gator
Member

Откуда: Москва
Сообщений: 14720
figli,

Не трогай сиквел!
Пусть в Аксес валит,
если Екселя не хватит.
Задача мелковата.
Дельфя тут не причём!
И все две станицы - вата.
Картинка с другого сайта.
5 авг 19, 19:36    [21942402]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
ёёёёё
Member

Откуда:
Сообщений: 579
figli
нафига дельфи? можно или через сам эксель на ВБ проверить, или еще проще(если знаком с mssql) написать один запрос через OPENQUERY

Кто его знает какие, какие критерии сравнения.
Какие настройки безопасности - может, доступ к vba заарыт намертво.
Может, тс вообще все наврал.
5 авг 19, 22:44    [21942519]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение 2 файлов (.xlsx) посредством Delphi  [new]
Мигалка
Member

Откуда:
Сообщений: 1244
ещё можно через адо. в дельфе не делал, а вот в вба
    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
6 авг 19, 08:25    [21942583]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Delphi Ответить