Страницы: 1
RSS
Сравнение двух массивов с элементами между собой, Сравнение двух массивов с элементами между собой на предмет количества одинаковых элементов
 
Добрый день!

Подскажите, пожалуйста, как правильно выстроить алгоритм сравнения двух массивов с данными между собой (столбцы А и B) на предмет количества одинаковых элементов, которые входят и в первый массив, и во второй, т.е. заполнение столбца I.
 
Напишите, как вы ручками это делаете, шаг за шагом.
 
Макрос. См. файл
Скрытый текст
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
Напишите, как вы ручками это делаете
С помощью формулы =СЧЁТЕСЛИ(), и далее подсчет количества одинаковых элементов по количеству строк с ИСТИНА. И так далее с каждым сравниваемым массивом.

Цитата
написал:
Макрос
Спасибо большое! На малом количестве элементов (или строк) работает отлично, на большем количестве элементов, я так понимаю, не хватает места Excel (ошибка overflow) - подсвечивается строка #9. При сокращении элементов подсвечивает строку #29.

Возможно ли прописать условие, например, чтобы не отображались (отбрасывались) "нулевые" сходства. Или, например, вывод производился в текстовый документ?
Изменено: Квершлаг - 07.06.2024 09:32:04
 
На сколько БОЛЬШОМ количестве?
У меня строки кода не пронумерованы.
На каких строках кода и при каких объемах исходных данных возникает ошибка?
Цитата
не отображались (отбрасывались) "нулевые" сходства
Это полное отсутствие совпадений? Равное 0?

См. код и файл. Данные в текстовом файле будут ПЕРЕЗАПИСЫВАТЬСЯ!
Скрытый текст
Изменено: Sanja - 07.06.2024 10:41:20 (Подправил код. Заменил файл)
Согласие есть продукт при полном непротивлении сторон
 
PQ
Пришелец-прораб.
 
Цитата
написал:
На сколько БОЛЬШОМ количестве?
количество строк в документе чуть меньше 60 000, а самих массивов 7 000.
Цитата
написал:
На каких строках кода и при каких объемах исходных данных возникает ошибка?
от 60 000 строк до 30 000 строк (7 000 массивов ÷ 3500 массивов) ошибка подсвечивается на строке кода:
Код
For I = LBound(arr, 1) To UBound(arr, 1)

от 30 000 строк до 26 500 строк (3500 массивов ÷ 2550 массивов) ошибка подсвечивается на строке кода:

Код
I = 0: ReDim newArr(1 To (dic.Count) ^ 2, 1 To 4)

при объеме от 26 500 строк до 1000 строки (2550 ÷ 140 массивов) ошибка подсвечивается на этой строке:

Код
 I = I + 1


Цитата
написал:
Равное 0?
Да, верно.
 
См. мое сообщение выше.
В код добавлена фильтрация нулевых значений и вывод в текстовый файл
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Квершлаг написал:
количество строк в документе чуть меньше 60 000, а самих массивов 7 000.
Т.е. у Вас в реальном файле не 2 столбца, а 7000?
Согласие есть продукт при полном непротивлении сторон
 
AlienSx, спасибо огромное! А запрос не выгружается по частям на разные листы?  Возникает аналогичная ситуация с тем, что не хватает строк на листе.


Цитата
написал:
не 2 столбца, а 7000?
нет, столбца только два. Под 7000 шт подразумеваю уникальные значения из первого столбца.
Цитата
написал:
См. мое сообщение выше.
Спасибо за помощь! Ошибка Overflow сохранилась на разных строках кода в зависимости от количества данных.
 
Цитата
Квершлаг написал:
Ошибка Overflow сохранилась на разных строках кода в зависимости от количества данных.
Можете выслать реальный файл на почту?
Скрытый текст
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Квершлаг написал:
А запрос не выгружается по частям на разные листы?
Table.Range к вашим услугам. Только строк у вас 49 млн (7000 * 7000 - 7000). Зачем это в Excel выгружать, пусть и по частям? Что вы делать с этим далее собираетесь?
Можно, конечно, попробовать загрузить это в Power Pivot и уже оттуда доставать с помощью DAX Studio (в CSV). Но дальше то что?
Пришелец-прораб.
 
Sanja, отправил.

Цитата
написал:
Что вы делать с этим далее собираетесь?
удалю те данные, у которых нет никаких общих элементов между собой, а также те данные, которые имеют пустые значения (не имеют элементов вовсе) - этот этап в самом начале сделаю, самым первым шагом. Уверен, что количество сократится. А далее анализировать данные, начиная с тех массивов, которые имеют наибольшее количество элементов и наибольший процент сходства. И далее по убыванию рассматривать вплоть до массивов с 1 элементом и, соответственно, с одним сходством. В конечном итоге объединятся массивы, и их количество уменьшится с 7000 шт до какого-то значения.
 
Цитата
Квершлаг написал:
я так понимаю, не хватает места Excel (ошибка overflow) - подсвечивается строка #9.
- поменяйте тип переменной на
Код
Dim I&

и overflow пропадёт
 
Цитата
Hugo написал:
и overflow пропадёт
Да, это пропадет
Появиться 'Out of memory'  в строке
Код
I = 0: ReDim newArr(1 To (dic.Count) ^ 2, 1 To 4)

Опытным путем установлено, что в результирующем массиве 2 389 104 строк
Это у Вас разовая задача?
Макрос, на Ваших данных, отработал за 8 мин. С выгрузкой в txt
Скрытый текст
Изменено: Sanja - 07.06.2024 14:19:56 (Lj,fdbk vfrhjc)
Согласие есть продукт при полном непротивлении сторон
 
Цитата
написал:
Это у Вас разовая задача?
после первой итерации по объединению массивов (уменьшению их количества) возможны следующие итерации по объединению, т.е. размер рассматриваемых данных будет снижаться.

Цитата
написал:
массиве 2 389 104 строк
сейчас заранее исключил массивы, которые вообще не имеют элементов, вышло 31 344 строк.
 
Квершлаг, pq с удаленными пустыми и нулями:
Код
let
    fr = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    a0 = Table.Group(fr, "Код1", {"new", (x)=>x[Код2]}),
    rec = Record.FromList(a0[new],a0[Код1]),
    lst = List.Buffer(a0[Код1]),
    frec=(x)=>Record.Field(rec,x),
    f1=(x)=>List.Select(lst, (y)=>y<>x),
    f2=(x,y)=>{x,y, List.Count(List.Intersect({frec(x),frec(y)})), List.Count(frec(y))},
    decart = List.TransformMany(lst, f1, f2),
    tbl = Table.FromList(decart, (x)=>x),
    tbl1 = Table.AddColumn(Table.SelectRows(tbl, (x)=>x[Column3]>0), "perc", (x)=>x[Column3]/x[Column4]),

    to = tbl1
in
    to
 
Sanja, AlienSx,Garrys, спасибо большое за помощь!  
Изменено: Квершлаг - 07.06.2024 21:04:10
Страницы: 1
Наверх