Добрый день! Спасибо всем гуру этого форума, которые помогают в простом решении непростых задач. Дай бог здоровья вашим мозгам. Требуется еще помощь.
Есть определенное количество строк по шесть столбцов каждая. В ячейках проставлены числа, например 1,2,3,4,5,6. Необходимо настроить поиск последовательных чисел по всем строкам. Например найти ячейки с числами 1,2,3, либо 3,4,5,6...и т.д. И второе. Можно ли сделать так, чтобы кол-во совпадений проставлялось в столбце справа: например 1,2,3 - 3 совпадения, 3,4,5,6 - 4 совпадения
Cupon, ну, если без изысков, без массивов и по пролетарски в лоб, то вот так можно. А если нужно именно в одном столбце, то ждите формулистов. Не сложно задачка решается еще и в Power Query. Причем в PQ её можно решить для произвольного количества столбцов. Интересует?
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
by = List.Count(Table.ColumnNames(Source)),
Custom1 = Table.AddColumn(Source, "Совпадения", each [
a = List.Buffer(Record.ToList(_)),
b = List.Transform(a, each -_),
c = List.Zip({ List.FirstN(b, by-1), List.LastN(a, by-1) }),
d = List.Transform(c, each List.Sum(_)),
e = List.Sum( List.Select(d, each _ = 1) ) + 1][e])
in
Custom1
И вот тут файлик перезалил, добавил вам там в генератор формирование этого столбца. В модели PowerPivot такое, можно сделать, но оно будет не динамически рассчитываемо. Но сводная на большом массиве будет обновляться несколько дольше.
начал разбираться, увидел одно НО если видно из файла....код считает как две последовательные пары за 3 и последовательность трех чисел тоже 3 тоже самое и с 4 и 5 можно это как-то исправить. Например через запятую итог 2;2 3;2 Или может будут получше мысли у вас...
Светлый, я сделал без допов вариант от PooHkrd, про несколько пар в исходном примере ни слова - см #1 и учтите, что мое сообщение #5, а про несколько пар возникло в #9 я знаю ограничения своей формулы, спасибо
Cupon написал: код считает как две последовательные пары за 3 и последовательность трех чисел тоже 3
Кто что считает. Код Алексея
Цитата
e = List.Sum( List.Select(d, each _ = 1) ) + 1][e])
считает сколько есть чисел в строке с расстоянием в 1 с просмотром слева на право по строке Хотя где то сбой на строке {111, 112, 113, 117, 121, 122} находит 4, хотя их пять Но, если переставить {122, 121, 117, 113, 112, 111}, то будет 0 А вам что нужно? Может попытаетесь объяснить... А то коллеги - кто в лес кто по дрова.
Андрей VG, не учел, что в ряду может быть более одной последовательности. Тут мой косяк, нужно считать не голую сумму списка, а разобрать на локальные группы единичек и считать суммы этих групп прибавляя к каждой сумме +1. Вот поправил:
Скрытый текст
Код
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
by = List.Count(Table.ColumnNames(Source)),
Custom1 = Table.AddColumn(Source, "Совпадения", each [
a = List.Buffer(Record.ToList(_)),
b = List.Transform(a, each -_),
c = List.Zip({ List.FirstN(b, by-1), List.LastN(a, by-1) }),
d = List.Transform(c, each if List.Sum(_) = 1 then 1 else null),
e = List.Sum( Table.Group( Table.FromColumns({ d }, {"1"}), {"1"}, {"2", each List.Sum([1]) + 1 }, GroupKind.Local )[2] )][e])
in
Custom1
Цитата
Андрей VG написал: Но, если переставить {122, 121, 117, 113, 112, 111}, то будет 0
Там такого не будет, в каждой строке списки всегда по возрастанию. Генератор строчек для данной задачи я (и не только) для ТС делал в другой теме. Ссылку приводил выше. Но в свете последних заявлений ТС, мне уже самому не понятно чего именно он хочет. То ли посчитать количество элементов, которые составляют последовательности, то ли количество самих последовательностей. Cupon, уважаемый, прошу определиться с условиями задачи.
Андрей VG, у меня числа будут идти всегда в порядке возрастания. Я и сам не учел что будут парные последовательности) сейчас ломаю голову...как мне лучше будет PooHkrd, мне конечно лучше количество элементов, которые составляют последовательности (т.е. 1,2,3,4 - 4; 1,2,3 - 3 и т.д.) а можно изменить формулу в вашем варианте. Может сделать как посоветовал Светлый
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
by = List.Count(Table.ColumnNames(Source)),
Custom1 = Table.AddColumn(Source, "Совпадения", each [
a = List.Buffer(Record.ToList(_)),
b = List.Transform(a, each -_),
c = List.Zip({ List.FirstN(b, by-1), List.LastN(a, by-1) }),
d = List.Transform(c, each if List.Sum(_) = 1 then 1 else null),
e = Table.Group( Table.FromColumns({ d }, {"1"}), {"1"}, {"2", each List.Sum([1]) + 1 }, GroupKind.Local )[2],
f = Text.Combine( List.Transform(e, Text.From), "-")][f])
in
Custom1
Странно вы в свою лотерею выигрываете. Ну, да вам решать.
PooHkrd,тут понимаете идет подбор с включением фантазии) сразу трудно сказать что именно надо. Будем спотыкаться, падать и подниматься PooHkrd,знаете, а вот 2-2, 2-3 мне нравится. Я думаю это оптимальный вариант только я имел ввиду как в PQ вставить новую формулу
Cupon написал: только я имел ввиду как в PQ вставить новую формулу
Если вы про ваш файлик из предыдущей темы, то вам туда я формулу перезалил. Но давайте вы все таки уже будете сами учиться втыкать готовые куски решений в ваш инструмент, поверьте, это совсем не сложно. Постоянно такой ерундой я заниматься не буду, это тогда уже техническая поддержка называется.
Cupon написал: сейчас ломаю голову...как мне лучше будет
Стачала нужно думать над тем, что есть и может быть, а уж потом над тем, что лучше Как в таком случае лучше? 1, 2, 3, 4, 5, 6 1, 2, 3, 4, 5, 11 1, 2, 3, 4, 11, 12 1, 2, 3, 11, 12, 13 1, 2, 11, 12, 13, 14 или 1, 2, 11, 12, 21, 22 1, 2, 31, 32, 41, 42 11, 12, 31, 32, 51, 52 21, 22, 41, 42, 51, 52