Страницы: 1
RSS
Превратить дубликаты в уникальные значения
 
Есть столбец с тысячами буквенно-цифровых значений. Несколько сотен из них повторяются - некоторые один раз, другие два, три и более раз. Нужно превратить эти дубли в уникальные значения, например, добавляя -1, -2 и т.д. в конец значения. Как это сделать? Предпочтительно в PQ.
 
Сортировка, добавить столбец индекса, потом пользовательский столбец с формулой типа: если Столбец{Индекс - 1} = Столбец {Индекс} то добавить к значению из столбца значение Индекс.
Потом удалить исходный Столбец и столбец Индекса.

Как-то так больная фантазия придумала.
Кому решение нужно - тот пример и рисует.
 
Имеется в виду, что следующий ряд:

0050
0456
0050
В46
В47
В78
В47
В47

Должен принять вид:

0050-1
0456
0050-2
В46
В47-1
В78
В47-2
В47-3
 
Стаканчик, Вариант.
=IF(COUNTIF($A$1:$A$8;A1)>1;A1&"-"&COUNTIF(A$1:A1;A1);"")
 
В соседний столбец формула.
Код
=ЕСЛИ(СЧЁТЕСЛИ(A:A;A1)>1;A1&"-"&СЧЁТЕСЛИ(A$1:A1;A1);A1)
 
Стаканчик, изучайте словари
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
вариант
Код
let
    Source = Excel.CurrentWorkbook(){[Name="src"]}[Content],
    tableTransformColumnTypes = Table.TransformColumnTypes(Source, {{"src", type text}}),
    tableAddIndexColumn = Table.AddIndexColumn(tableTransformColumnTypes, "Index"),
    tableGroup =
        Table.Group(
            tableAddIndexColumn,
            {"src"},
            {
                {
                    "count",
                    (x) => [
                        tableRowCount = Table.RowCount(x),
                        tableAddIndexColumn = Table.AddIndexColumn(x, "Index_Local", 1, 1),
                        tableAddColumn =
                            Table.AddColumn(
                                tableAddIndexColumn,
                                "source",
                                (y) => if tableRowCount > 1 then y[src] & "-" & Text.From(y[Index_Local]) else y[src],
                                type text
                            )
                    ][ tableAddColumn ],
                    type table
                }
            }
        ),
    tableRemoveColumns = Table.RemoveColumns(tableGroup, {"src"}),
    tableExpandTableColumn = Table.ExpandTableColumn(tableRemoveColumns, "count", {"Index", "source"}, {"Index", "src"}),
    tableSort = Table.Sort(tableExpandTableColumn, {{"Index", Order.Ascending}}),
    tableSelectColumns = Table.SelectColumns(tableSort, {"src"})
in
    tableSelectColumns
 
te1n, Измените имя отображаемое в профиле, согласно правилам форума.
По вопросам из тем форума, личку не читаю.
 
Спасибо! Вариант с countif работает прекрасно, но при больших объемах данных на расчет и копирование/вставку значений уходит уйма времени. PQ попробую чуть позже.
 
te1n, я такой сложный код писать не умею)
Почти все простыми шагами сделал
Код
let
    Источник = Excel.CurrentWorkbook(){[Name="src"]}[Content],
    #"Добавлен индекс" = Table.AddIndexColumn(Источник, "Индекс", 1, 1),
    #"Сгруппированные строки" = Table.Group(#"Добавлен индекс", {"src"}, {{"Количество", each Table.AddIndexColumn(_, "Индекс1", 1,1), type table}}),
    #"Развернутый элемент Количество" = Table.ExpandTableColumn(#"Сгруппированные строки", "Количество", {"Индекс", "Индекс1"}, {"Индекс", "Индекс1"}),
    #"Измененный тип" = Table.TransformColumnTypes(#"Развернутый элемент Количество",{{"src", type text}, {"Индекс1", type text}}),
    #"Добавлен пользовательский объект" = Table.AddColumn(#"Измененный тип", "Код", each [src]&"-"&[Индекс1]),
    #"Сортированные строки" = Table.Sort(#"Добавлен пользовательский объект",{{"Индекс", Order.Ascending}}),
    #"Удаленные столбцы" = Table.RemoveColumns(#"Сортированные строки",{"src", "Индекс", "Индекс1"})
in
    #"Удаленные столбцы"
 
еще вариант:
Код
let
    Source = Excel.CurrentWorkbook(){[Name="src"]}[Content],
    a = Table.Group(Source, "src", {"q", (x)=> if List.Count(x[src]) = 1 then x[src] else [a = x[src], b = {"1"..Text.From(List.Count(x[src]))}, c = List.Transform(List.Zip({a, b}) , (x)=> x{0} & " - " & x{1})][c]})[q],
    q = List.Combine(a)
in
    q
Страницы: 1
Наверх