Множественный поиск и замена с включениями и исключениями

Мне нужно найти и заменить несколько текстовых строк во фразах. Строки поиска следует выбирать по критериям, известным как «Сайты». Существует критерий «включения» и критерия «исключения».

  1. Критерии

    СтрокаНет Набор списков (А) Значения для поиска (B) Значения для замены (C) Включения (Д) Исключения (Е) Поиск (Ф) Заменить (G) (8) Аниме набор Сцены Аниме Сцены =IFERROR(ARRAYFORMULA("^("&QUERY(B8:B,"SELECT Col1 WHERE Col1 IS NOT NULL")&")$\|^("&QUERY(B8:B,"SELECT Col1 WHERE Col1 IS NOT NULL")&")(,)\|(,)("&QUERY(B8:B,"SELECT Col1 WHERE Col1 IS NOT NULL")&")(,)\|(,)("&QUERY(B8:B,"SELECT Col1 WHERE Col1 IS NOT NULL")&")$"),)=IFERROR(ARRAYFORMULA("$4$7"&QUERY(C8:C,"SELECT Col1 WHERE Col1 IS NOT NULL")&"$3$6"),) (9) Аниме набор Факты Факты об аниме Сайт 1 (10) Аниме набор Мемы Мемы из аниме Сайт 1 (11) Набор фильмов Сцены Сцены из фильма (12) Набор фильмов Факты Факты о кино Сайт 2 Сайт 3 (13) Набор фильмов Мемы Мемы из фильмов (14) Музыкальный набор Факты Факты о музыке (15) Музыкальный набор Фестиваль Музыкальный фестиваль Сайт 4 (16) Музыкальный набор Приложение Музыкальное приложение Сайт 4
  2. Исходные данные и желаемые результаты:

    СтрокаНет Набор списков (H) Принадлежность (я) Тексты (Дж) Замененные тексты (К) (8) Аниме набор Сцены,Факты,Мемы Сцены из аниме,Факты,Мемы из аниме (9) Аниме набор Сайт 1 Сцены,Факты,Мемы Сцены из аниме,Факты об аниме,Мемы (10) Набор фильмов Сцены,Факты,Мемы Сцены из фильмов,Факты,Мемы из фильмов (11) Набор фильмов Сайт 2 Сцены,Факты,Мемы Сцены из фильмов,Факты о кино,Мемы из фильмов (12) Набор фильмов Сайт 3 Сцены,Факты,Мемы Сцены из фильмов,Факты,Мемы из фильмов (13) Музыкальный набор Факты, фестиваль, приложение Факты о музыке, фестивале, музыкальном приложении (14) Музыкальный набор Сайт 4 Факты, фестиваль, приложение Факты о музыке, музыкальном фестивале, приложении

Фразы для обработки находятся в столбце «Тексты» (J), а желаемые результаты — в столбце «Замененные тексты» (K).

Некоторые пояснения:

  • В зависимости от набора и принадлежности списка к текстам применяются значения поиска и замены;
  • Как видно выше в таблице, ячейки К8 и К9 различаются по принадлежности, а не по списочному набору - поэтому значение Facts заменяется на Facts about Anime только для Site 1(К9, а не К8) (в Таблице 1 это значение во включениях и применяется к текстам только при наличии совпадений по принадлежности);
  • Другой пример с ячейками К11 и К12: в ячейке К11 заменяется значение Факты (т.к. оно находится во включениях), а в ячейке К12 это значение игнорируется (т.к. оно находится в исключениях по данной принадлежности).

Возможно связанный вопрос

Формула, которую я пробовал (К8):

=IFERROR(LAMBDA(data,re,with,BYROW(data,LAMBDA(r,IF(r = "","",REDUCE(r,SEQUENCE(COUNTA(re)),LAMBDA(ini,v,REGEXREPLACE(ini,INDEX(re,v),INDEX(with,v))))))))(QUERY(J8:J,"SELECT Col1 WHERE Col1 IS NOT NULL"),QUERY(A8:I,"SELECT Col6 WHERE Col6 IS NOT NULL AND Col1 IS NOT NULL AND Col1 MATCHES '("&$A$5&")'"),QUERY(A8:I,"SELECT Col7 WHERE Col7 IS NOT NULL AND Col1 IS NOT NULL AND Col1 MATCHES '("&$A$5&")'")),)

Исправил, что смог. Если найду ошибки, исправлю их снова.

Stes Mus 27.02.2024 15:09

Можете ли вы показать более реалистичный пример, например, campaign вместо S_Word1 и так далее? Можете ли вы также показать некоторые исходные данные и желаемый результат после их преобразования, как указано в строках поиска и замены, которые вы показываете в приведенных выше таблицах? Также убедитесь, что вы не задаете вопрос XY.

doubleunary 27.02.2024 18:31

Добавьте таблицу ожидаемых выходных данных, содержащую значения, ожидаемые по формуле для данного входного сигнала.

TheMaster 27.02.2024 19:28

Починил это. Извините, я сам немного запутался.

Stes Mus 28.02.2024 08:33

Намного лучше. Если можете, пожалуйста отредактируйте, чтобы объяснить, почему k8 — это Anime Scenes,Facts,Memes from Anime, а k9 — это Anime Scenes,Facts about Anime,Memes (любые два примера объяснения). Это поможет немного облегчить понимание вашего вопроса.

TheMaster 28.02.2024 08:37

Добавил некоторые пояснения.

Stes Mus 28.02.2024 08:59

Не могли бы вы определить желаемый результат на основе ваших данных? (т. е. не на основе ваших пробных формул). Определение вашего вопроса с помощью неудавшейся формулы имело бы смысл, если бы ваш вопрос заключался в том, почему определенная формула не работает или почему она дает определенную ошибку. Это не вариант. Кроме того, если вы предпочитаете использовать query, вы все равно можете добавить это требование (в одну строку).

Argyll 28.02.2024 09:20

@Argyll Я считаю, что раздел «Что я ожидаю увидеть § некоторые объяснения» проясняет проблему на основе входных данных, а не формул.

TheMaster 28.02.2024 09:22

@TheMaster: «поэтому значение «Факты» заменяется только для Сайта 1 (в Таблице 1 это значение находится во включениях и применяется только к текстам, если есть совпадение по принадлежности)» <-- Я не знаю, что это значит . Я предполагаю, что пробные формулы могут объяснить это через раздел «Формула 3 должна работать следующим образом». Но пробные формулы — это именно то, что нужно. Это было бы плохо для передачи намерений.

Argyll 28.02.2024 09:24

Для справки: вам всегда следует добавлять то, что вы пробовали, но в этом случае это очень длинно и отвлекает от реального вопроса, и выглядит лучше, если его удалить.

TheMaster 28.02.2024 12:59

@TheMaster Спасибо за исправления и объяснения (впервые здесь). Решения в ответах пока не проверял, свободного времени пока нет.

Stes Mus 28.02.2024 14:49

Учитывает ли формула, что включения/исключения могут содержать несколько сайтов (в одной ячейке, например, перечисляются через запятую)? Я имею в виду, что фильтрация должна проверять соответствие сайта, а не совпадение точного текста ячейки включения/исключения. Это необязательно, но возможно ли это?

Stes Mus 28.02.2024 15:09

На мой ответ: нет, но это должно быть возможно.

TheMaster 28.02.2024 15:37

Пожалуйста, не предъявляйте новых требований после получения ответа. Задавайте только один вопрос в посте . Вместо этого опубликуйте новый вопрос.

doubleunary 28.02.2024 16:06

В вопросе упоминается совпадение сайта/принадлежности. В ранних версиях вопроса в Таблице 1 даже перечислялись несколько сайтов, включенных и исключенных. Этот момент просто был упущен в процессе монтажа.

Stes Mus 28.02.2024 16:19

Обратите внимание, что сайты Stack Exchange — это не «справочные форумы» или «доски обсуждений», а вики-сайты, использующие формат вопросов и ответов. Кроме того, в сообщении недостаточно информации, чтобы ответить на новый вопрос о нескольких сайтах. Было бы лучше опубликовать новый вопрос, показывающий реалистичные образцы данных и введенные вами вручную желаемые результаты.

doubleunary 28.02.2024 16:26

Действительно, Версия №3 действительно показывает несколько сайтов, но она была удалена не другими редакторами, а вами. После публикации ответов на основе текущей версии обычно не рекомендуется редактировать вопросы или добавлять новые требования. Сказав это, я уверен, что то, что вам нужно, легко, и вы сможете понять это самостоятельно.

TheMaster 28.02.2024 16:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
18
142
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте filter(), reduce() и substitute(), например:

=let( 
  get_, lambda(a, filter(a, len(H8:H))), 
  map(get_(H8:H), get_(I8:I), get_(J8:J), lambda(set, site, phrase, let( 
    includedSearchWords, filter( 
      B8:C, 
      A8:A = set, 
      (D8:D = site) + (D8:D = ""), 
      (E8:E <> site) + (E8:E = "") 
    ), 
    searchFor, choosecols(includedSearchWords, 1), 
    replaceWith, choosecols(includedSearchWords, 2), 
    join(",", map(split(phrase, ","), lambda(text, 
      reduce(text, sequence(rows(searchFor)), lambda(t, i, 
        substitute(t, index(searchFor, i), index(replaceWith, i)) 
      )) 
    ))) 
  ))) 
)

Формула переходит в ячейку K8 таблицы:

Набор списков (А) Значения для поиска (B) Значения для замены (C) Включения (Д) Исключения (Е) Набор списков (H) Принадлежность (я) Тексты (Дж) Замененные тексты (К) (желаемые результаты) Аниме набор Сцены Аниме Сцены Аниме набор Сцены,Факты,Мемы Сцены из аниме,Факты,Мемы из аниме Сцены из аниме,Факты,Мемы из аниме Аниме набор Факты Факты об аниме Сайт 1 Аниме набор Сайт 1 Сцены,Факты,Мемы Сцены из аниме,Факты об аниме,Мемы Сцены из аниме,Факты об аниме,Мемы Аниме набор Мемы Мемы из аниме Сайт 1 Набор фильмов Сцены,Факты,Мемы Сцены из фильмов,Факты,Мемы из фильмов Сцены из фильмов,Факты,Мемы из фильмов Набор фильмов Сцены Сцены из фильма Набор фильмов Сайт 2 Сцены,Факты,Мемы Сцены из фильмов,Факты о кино,Мемы из фильмов Сцены из фильмов,Факты о кино,Мемы из фильмов Набор фильмов Факты Факты о кино Сайт 2 Сайт 3 Набор фильмов Сайт 3 Сцены,Факты,Мемы Сцены из фильмов,Факты,Мемы из фильмов Сцены из фильмов,Факты,Мемы из фильмов Набор фильмов Мемы Мемы из фильмов Музыкальный набор Факты, фестиваль, приложение Факты о музыке, фестивале, музыкальном приложении Факты о музыке, фестивале, музыкальном приложении Музыкальный набор Факты Факты о музыке Музыкальный набор Сайт 4 Факты, фестиваль, приложение Факты о музыке, музыкальном фестивале, приложении Факты о музыке, музыкальном фестивале, приложении Музыкальный набор Фестиваль Музыкальный фестиваль Сайт 4 Музыкальный набор Приложение Музыкальное приложение Сайт 4

Видеть let(), лямбда(), карта(), Split(), фильтр(), selectcols(), последовательность(), уменьшить(), replace() и join().

Этот вариант не совсем подходит: 1) он сдвигает массив, если в столбце H не задан список; 2) не работает с регулярными выражениями, что очень важно (с теми формулами в столбцах F и G, а не в столбцах B и C).

Stes Mus 28.02.2024 16:26

Хм... формула в ответе точно соответствует желаемым результатам, которые вы показываете. Он действительно полностью игнорирует строки выборочных данных, в которых столбец H пуст. В примере данных таких строк нет, и я не думаю, что вы указали, каким должен быть результат, когда набор списков пуст. Лучше всего опубликовать новый вопрос, в котором будут указаны новые требования и показаны реалистичные образцы данных вместе с введенными вручную желаемыми результатами.

doubleunary 28.02.2024 16:31
Ответ принят как подходящий
  • Создайте фильтр для фильтрации по набору списков, включениям и исключениям, чтобы создать необходимый поиск и заменить регулярные выражения.
=TOROW( 
  FILTER($B$8:$C$16,
    H8=$A$8:$A$16,//List set filter 
    (I8=$D$8:$D$16)+($D$8:$D$16 = ""),//Inclusions filter
    ($E$8:$E$16<>I8)+(I8 = "")// Exclusions filter
))
  • Используйте последовательную замену регулярных выражений, используя REDUCE, как описано здесь
=ARRAYFORMULA( 
  MAP(J8:J14,I8:I14,H8:H14, 
    LAMBDA(j,i,h,
      REDUCE(j,
        BYROW( 
          FILTER($B$8:$C$16,
            h=$A$8:$A$16,
            (i=$D$8:$D$16)+($D$8:$D$16 = ""),
            ($E$8:$E$16<>i)+(i = "")
          ),
          LAMBDA(r, JOIN("🏝",r))
        ), 
        LAMBDA(a,c,
          LET(
            arr,TOCOL(SPLIT(c,"🏝",0)),
            rgx,INDEX(arr,1), 
            repl,INDEX(arr,2),
            REGEXREPLACE(a,rgx,repl)
          )
        )
      )
    )
  )
)

Отсутствует проверка на частичное, а не полное совпадение сайтов во включениях и исключениях. Остальное, на первый взгляд, работает отлично. Серьезных тестов я еще не делал.

Stes Mus 28.02.2024 16:16

@StesMus Вам просто нужно адаптировать = функцию сравнения к REGEXMATCH функции здесь (i=$D$8:$D$16) и здесь ($E$8:$E$16<>i) в расчетах фильтра.

TheMaster 28.02.2024 16:23

Другие вопросы по теме

Похожие вопросы

Как мне получить сумму чьих-либо доходов на нескольких таблицах, где она будет суммироваться только в том случае, если указано имя этого человека в таблицах Google
Ошибка 503 в боковой панели и модальном окне скрипта Google Apps
Всплывающее окно при редактировании ячейки – Google Sheet
Используйте раскрывающийся список (из диапазона) для ввода данных. Изменить элементы раскрывающегося списка. Данные устарели (как отразить изменения?)
Загрузка файлов, созданных Google Apps Script (Sheets), через Ruby
Google Таблицы: используйте условную функцию, чтобы разделить предложение в одной ячейке на несколько частей в последующих ячейках
Google Таблицы: разбейте текст на группы по четыре слова: поместите каждую группу из четырех слов в ячейки по всей строке, максимум 12 слов / 3 столбца
Как получить всю информацию о листах Google в определенном диапазоне? (Текст и стиль)
Google Таблицы группируются по строкам?
Оптимизация кода для помещения значений «по умолчанию», взятых из электронной таблицы, в поля формы HTML