Как найти строку в списке по её части?
-
Есть список вида:
id2000001;2021-09-02
id2000002;2021-09-03
id2000003;2021-09-04
id2000004;2021-09-05
id2000005;2021-09-06
id2000006;2021-09-07
id2000007;2021-09-08
id2000008;2021-09-09
id2000009;2021-09-10
id2000010;2021-09-11
Мне надо в нём проверить, существует ли строка, содержащая id до разделителя ;. Например, надо проверить, существует ли в списке значение «id2000010». При этом все id уникальны и не может быть частичного пересечения, например,
id2000009
и
id20000090
Функция Содержит для списков вроде бы ищет только строку списка целиком.
Выкручивался тем, что список преобразовывал в строку, и парсил через Первое вхождение. Но когда в списке стало >20k строк, при преобразовании в строку BAS начал тормозить. Думаю, должен быть более грамотный способ проверки, но сам не могу понять как.
-
@Dim said in Как найти строку в списке по её части?:
Есть список вида:
id2000001;2021-09-02
id2000002;2021-09-03
id2000003;2021-09-04
id2000004;2021-09-05
id2000005;2021-09-06
id2000006;2021-09-07
id2000007;2021-09-08
id2000008;2021-09-09
id2000009;2021-09-10
id2000010;2021-09-11
Мне надо в нём проверить, существует ли строка, содержащая id до разделителя ;. Например, надо проверить, существует ли в списке значение «id2000010». При этом все id уникальны и не может быть частичного пересечения, например,
id2000009
и
id20000090
Функция Содержит для списков вроде бы ищет только строку списка целиком.
Выкручивался тем, что список преобразовывал в строку, и парсил через Первое вхождение. Но когда в списке стало >20k строк, при преобразовании в строку BAS начал тормозить. Думаю, должен быть более грамотный способ проверки, но сам не могу понять как.Нельзя ли все это хранить не в виде списка, а в txt файле, оттуда получить действием "Читать файл", а затем из переменной в которую прочитали, искать нужное значение нужное значение с помощью действия "Найти подстроку". Ну или список записать в файл, если это будет быстрее чем список преобразовывать в строку и выполнить действия описанные выше
-
@Dim @Benson9999 регулярные выражения затратная штука по ресурсам, а если так:
VAR_YOUR_LIST // ваша переменная со списком значений VAR_YOUR_CHECK // ваша переменная с уникальным id for(i=0;i<VAR_YOUR_LIST.length;i++){ if(VAR_YOUR_LIST[i].split(";")[0]==VAR_YOUR_CHECK) { break; //я поставил прерывание вы делайте как вам нужно } }
это тоже не быстро, но все равно быстрее чем регулярка, и если у вас списки большие лучше использовать базу кмк.
-
@Benson9999 said in Как найти строку в списке по её части?:
Нельзя ли все это хранить не в виде списка, а в txt файле, оттуда получить действием "Читать файл", а затем из переменной в которую прочитали, искать нужное значение нужное значение с помощью действия "Найти подстроку". Ну или список записать в файл, если это будет быстрее чем список преобразовывать в строку и выполнить действия описанные выше
А сейчас как раз это всё и храниться в тексте. Что-то типо базы idшников в .txt. При каждой итерации, если id нету в списке, он туда вносится, поэтому список постоянно растёт. Каждую итерацию файл читается в список, который переводится в строку. Вот здесь и начинаются тормоза при конвертации списка в строку.
Я вот только немного не понял этот вариант "список записать в файл". Ведь это сейчас и делается. Или я что-то неправильно понял?@lotra said in Как найти строку в списке по её части?:
это тоже не быстро, но все равно быстрее чем регулярка, и если у вас списки большие лучше использовать базу кмк.
Здесь немного не то, регулярка пока что отлично отрабатывает, быстро. Тормоза именно при конвертации списка в строку. Я думал, что можно как-то парсить не строку, а именно список. Чтобы BAS нашёл нужную мне строку в списке по её части. Например, есть строка в списке "id2000010;2021-09-11". У меня есть часть этой строки "id2000010". Вот мне надо как-то получить строку полностью по этой части (а потом регуляркой второю половину, но это уже ерунда).
-
Спустя сутки работы допёр. Всё гораздо проще получилось. Было так: читал текстовой файл в список, потом список конвертировал в строку, и парсил строку. Сделал: Читаю файл в переменную, и сразу её паршу. Избавился от тормозного шага :)
Всем спасибо!