Вопрос или проблема
Я создал таблицу Excel, которая перечисляет комиксы в коллекции. Для каждого комикса есть строка данных. В одной ячейке содержится список выпусков для этого комикса. Пример этого выглядит так:
1-3,5-7,12-23, 25,28-34,36-38,43.
То есть у меня есть выпуски с 1 по 3, с 5 по 7, с 12 по 23, 25 и т. д.
Мне следовало бы подсчитать общее количество для каждого комикса, но я задаюсь вопросом, есть ли способ “посчитать” количество комиксов для каждого типа из моего списка выпусков?
Спасибо
Если у вас есть Excel 365, вы можете использовать эту формулу:
=LET(step1,VALUE(TRIM(TEXTSPLIT(A1,"-",","))),step2,BYROW(step1,LAMBDA(val,IFERROR(INDEX(val,1,2)-INDEX(val,1,1)+1,1))),SUM(step2))
LET()
принимает имена переменных и значения, а затем сохраняет эти значения для последующего использования по имени переменной.step1,VALUE(TRIM(TEXTSPLIT(A1,"-",",")))
разбивает ваш текст на строки (когда есть запятая) и столбцы (когда есть дефис), удаляет все пробелы, а затем преобразует его из текста в числовое значение. Полученный массив сохраняется какstep1
.step2,BYROW(step1,LAMBDA(val,IFERROR(INDEX(val,1,2)-INDEX(val,1,1)+1,1)))
выглядит намного сложнее (по крайней мере для меня), но он проходит через каждую строкуstep1
и вычитает первое значение из второго. Если второго значения нет, то уstep1
возникает ошибка, поэтому мы используемIFERROR()
, чтобы вернуть1
в этом случае.SUM(step2)
суммирует результат.
Нам нужно:
a) разбить строку по запятым, чтобы получить уникальные диапазоны, и
b) разбить каждый диапазон по дефису, чтобы рассчитать, сколько элементов представлено в нем.
Если диапазон состоит из двух чисел, тогда мы рассчитываем INDEX(p,,2)-INDEX(p,,1)+1
.
Если диапазон состоит лишь из одного числа, мы можем преобразовать его в такой же формат с помощью INDEX(p,,1)-INDEX(p,,1)+1
.
Тогда единственным переменным компонентом является индекс столбца первого вызова INDEX
, который мы можем получить, подсчитав количество чисел в результате разбивки по дефису.
Мы применяем функцию для расчета (b) к массиву, полученному из (a), а затем суммируем результат.
=SUM(
MAP(
TEXTSPLIT(B2, ","),
LAMBDA(s,
LET(
p, --TEXTSPLIT(s, "-"),
INDEX(p, , COUNT(p)) - INDEX(p, , 1) + 1
)
)
)
)
Еще один вариант.
Этот список чисел можно преобразовать в адреса, и можно подсчитать сумму строк.
Итоговая формула:
=REDUCE(0, SUBSTITUTE("A"&TEXTSPLIT(SUBSTITUTE(A2," ",""),","),"-",":A"),
LAMBDA(a, x, a+ROWS(INDIRECT(x))))
Счетчик выпусков как отдельный скрипт на Python:
#!/bin/env python
def issues(lst="1-3,5-7,12-23, 25,28-34,36-38,43."):
L=0
x=lst.split(",")
for rng in x:
rng=rng.strip('. ')
if '-' in rng:
a,b=rng.split('-')
a=int(a)
b=int(b)+1
else:
a=int(rng)
b=a+1
r=range( a, b )
print(
f'{rng:>6}',
'\t',a,b,
'\t',L,'-',
','.join( [ f'{z}' for z in r] )
)
L+=len(r)
return L
print(issues())
Примечание: Некоторые версии Excel могут запускать python-скрипты, но только отправляя их в облако.
Код: Две print()
инструкции предназначены для проверки правильности вывода, с примером списка выпусков в качестве параметра по умолчанию для функции.
Пример выполнения, как есть:
$ python ./issues.py
1-3 1 4 0 - 1,2,3
5-7 5 8 3 - 5,6,7
12-23 12 24 6 - 12,13,14,15,16,17,18,19,20,21,22,23
25 25 26 18 - 25
28-34 28 35 19 - 28,29,30,31,32,33,34
36-38 36 39 26 - 36,37,38
43 43 44 29 - 43
30
… удалите инструкции print() и остальная часть — это функция, которую можно импортировать в чистом Python; как использовать ее в Excel, не известно (мне) на момент написания этого.
Ответ или решение
Чтобы определить количество элементов в ячейке Excel, содержащей диапазоны номеров пожарных изданий комиксов, можно использовать несколько методов. Я приведу подробное объяснение каждого из них, чтобы вы могли выбрать наиболее подходящий для вас.
1. Использование формулы в Excel 365
Если у вас есть Excel 365, вы можете воспользоваться следующей формулой с использованием функции LET
, которая позволит более эффективно обрабатывать данные:
=LET(step1,VALUE(TRIM(TEXTSPLIT(A1,"-",","))),step2,BYROW(step1,LAMBDA(val,IFERROR(INDEX(val,1,2)-INDEX(val,1,1)+1,1))),SUM(step2))
Объяснение формулы:
- LET: Эта функция определяет именные переменные для использования в вычислениях. Здесь используются
step1
иstep2
. - TEXTSPLIT: Разделяет содержимое ячейки на элементы, сначала по запятой (для разделения диапазонов), затем по дефису (для разделения ограничений диапазона), убирая пробелы.
- VALUE: Преобразует текстовое значение в числовое.
- BYROW: Применяет функцию к каждому элементу в массиве, вычисляя количество элементов в каждом диапазоне.
- IFERROR: Обрабатывает возможные ошибки, возвращая 1, если диапазон содержит только одно число.
- SUM: Подсчитывает общее количество всех элементов.
Эта методика позволяет эффективно обработать сложные диапазоны и подвести итог по количеству комиксов для каждой категории.
2. Альтернативное решение с использованием MAP
Для более наглядного подхода можно использовать следующую формулу, которая упрощает логику подсчёта:
=SUM(
MAP(
TEXTSPLIT(B2, ","),
LAMBDA(s,
LET(
p, --TEXTSPLIT(s, "-"),
INDEX(p, , COUNT(p)) - INDEX(p, , 1) + 1
)
)
)
)
За счёт этого метода:
- Мы сначала разбиваем строки по запятой для получения отдельных диапазонов.
- Затем для каждого диапазона вычисляем общее количество, используя тот же принцип обращения к элементам массива.
3. Использование функции REDUCE
и адресации
Ещё один интересный способ подсчёта может быть реализован с помощью сочетания функций SUBSTITUTE
и INDIRECT
:
=REDUCE(0, SUBSTITUTE("A"&TEXTSPLIT(SUBSTITUTE(A2," ",""),","),"-",":A"),
LAMBDA(a, x, a+ROWS(INDIRECT(x))))
Здесь:
- SUBSTITUTE: Удаляет лишние пробелы и преобразует диапазоны в адреса.
- REDUCE: Суммирует количество строк в каждом диапазоне, вычисляемым с помощью ROWS и INDIRECT.
4. Сценарий на Python
Если вам удобнее работать с Python, вы можете использовать следующий сценарий для подсчёта:
def issues(lst="1-3,5-7,12-23, 25,28-34,36-38,43."):
L=0
x=lst.split(",")
for rng in x:
rng=rng.strip('. ')
if '-' in rng:
a,b=rng.split('-')
a=int(a)
b=int(b)+1
else:
a=int(rng)
b=a+1
r=range(a, b)
L += len(r)
return L
print(issues())
Этот скрипт обрабатывает строку формата 1-3,5-7,...
, подсчитывая общее количество изданий.
Заключение
Каждый из предложенных методов позволяет вам подсчитать количество позиций в заданной строке с номерами изданий. Метод с формулами в Excel наиболее предпочтителен для использования непосредственно в вашем документе, а сценарий на Python может быть полезен для более сложных задач обработки данных. Выберите подходящий способ в зависимости от ваших потребностей и удобства работы с инструментом.