Поиск данных в большой таблице (50к строк и более)

Hannes

Client
Регистрация
03.02.2016
Сообщения
501
Благодарностей
244
Баллы
43
Добрый день!

Есть две таблицы:
A - большая таблица, 50к+ строк, 3 столбца (А1, А2, А3).
Б - таблица на 300 строк, 3 столбца (Б1, Б2, Б3).

Нужно взять строку из таблицы Б и провести поиск в таблице А по значению Б3. Если в таблице А, в столбце А3 есть идентичное значение значению Б3, то такие строки сохраняем.

Перебором (взять строку - сравнить) выходит очень долго. Как можно ещё сделать?
Буду рад совету! Спасибо!
 

runlike

Client
Регистрация
22.09.2015
Сообщения
175
Благодарностей
51
Баллы
28
Ну еще есть вариант объединить все строки в одну переменную и регексом прогнать на нужное значение. Правда не знаю, нормально ли влезет 50к строк в одну переменную. А то что долго, это логично. Огромный объем информации
 
  • Спасибо
Реакции: Hannes

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 450
Благодарностей
1 880
Баллы
113
На форуме уже сотни раз обсуждалась тема поиска по таблицам, поищите, есть готовые снипеты, которые помогут Вам в этом.
 
  • Спасибо
Реакции: Hannes

Hannes

Client
Регистрация
03.02.2016
Сообщения
501
Благодарностей
244
Баллы
43
Перед созданием темы ознакомился с похожими, но реализовать не получилось/либо не подходили способы.

Есть вариант на C#
http://zennolab.com/discussion/threads/temnaja-storona-c-ily.18118/

Поиск данных в таблице:
Использование:
Код:
project.Context["findInTable"] = (Func<string, string, string, IEnumerable<string>>)((Table, Column, Text) => {
   var Tbl = project.Tables[Table];
   for(int i = 0; i < Tbl.RowCount; i++) {
     if(Tbl.GetCell(Column, i).Trim() == Text.Trim()) {
       return Tbl.GetRow(i);
     }
   }
   return null;
});
Использование:
Код:
//Ищем строку в таблице Users, в которой значение в первой ячейке - Vasya
var Row = project.Context["findInTable"]("Users", "A", "Vasya");
if(Row != null) {
   var Surname = Row[1];
   var Password = Row[2];
}
Итог: закидываю все в "C# код", выполняю код. Кладу результат в переменную search. В итоге она выдает ОК и все, а не результат.
1.png
Может что-то не правильно сделал? Подскажите пожалуйста!

А других вариантов не нашел (перебор не считаю, ибо слишком долго выходит).
 
Последнее редактирование:

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
если выдает ОК значит до этого места никогад не доходит
upload_2016-4-29_16-57-0.png


и в коде нельзя использовать макросы {-Variable.-}
Нужно использовать project.Variables["имяпеременной"].Value
 
  • Спасибо
Реакции: Hannes

Hannes

Client
Регистрация
03.02.2016
Сообщения
501
Благодарностей
244
Баллы
43
Не хочет работать все равно...

reg - название таблицы
add - переменная, содержащая текст, который ищу в таблице
Выдает ок и все...

Код:
project.Context["findInTable"] = (Func<string, string, string, IEnumerable<string>>)((Table, Column, Text) => {
   var Tbl = project.Tables[Table];
   for(int i = 0; i < Tbl.RowCount; i++) {
     if(Tbl.GetCell(Column, i).Trim() == Text.Trim()) {
       return Tbl.GetRow(i);
     }
   }
   return null;
});

//Ищем строку в таблице Users, в которой значение в первой ячейке - Vasya
var Row = project.Context["findInTable"]("reg", "B", project.Variables["add"].Value);
if(Row != null) {
   var Surname = Row[1];
   var Password = Row[2];
}
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)