Как найти строку в списке по её части?



  • Есть список вида:
    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 файле, оттуда получить действием "Читать файл", а затем из переменной в которую прочитали, искать нужное значение нужное значение с помощью действия "Найти подстроку". Ну или список записать в файл, если это будет быстрее чем список преобразовывать в строку и выполнить действия описанные выше


  • Banned

    @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". Вот мне надо как-то получить строку полностью по этой части (а потом регуляркой второю половину, но это уже ерунда).



  • Спустя сутки работы допёр. Всё гораздо проще получилось. Было так: читал текстовой файл в список, потом список конвертировал в строку, и парсил строку. Сделал: Читаю файл в переменную, и сразу её паршу. Избавился от тормозного шага :)
    Всем спасибо!


Log in to reply