Страницы: 1
RSS
Разделение текста в ячейке на строки по абзацу со сведением данных
 
Добрый день!

Имеется таблица с 3мя столбцами (Задача, Исполнитель, Срок исполнения). В столбе "Задача" в одной ячейке может быть несколько пронумерованных и разделенных абзацем задач, которые необходимо отразить в отдельных ячейках построчно и связать с данными других столбцов исходя из нумерации, при этом номер указанный перед "исполнителем"/"сроком исполнения" соответствует номеру задачи соответствующей строки, но при этом если для одного "исполнителя" есть несколько задач номер может быть представлен как "2, 4, 5." или "1-5.", подробнее пример во вложении (в примере в таблице "Как есть" 3 строки, в реальной 18). Реально ли это реализовать, максимально исключив ручные корректировки документа?
Изменено: Regi27 - 24.01.2020 05:14:55
 
Доброе время суток
Цитата
Regi27 написал:
Реально ли это реализовать, максимально исключив ручные корректировки документа?
Да, вполне. С помощью VBA или Power Query.
 
Вопрос как? (забыл уточнить в первом письме, что нужно решение)). Желательно конечно через VBA, но поиск готовых решений успехом не увенчался, в т.ч. на англоязычных ресурсах - предлагаемые макросы не подразумевали дальнейшее сведение данных и не работали, а из формульных решений нашел способ разделения на строки по абзацу. Уровня знаний Power Query также не хватает для решения задачи.
 
Попробуйте дождаться волонтера или обратиться в раздел "Работа". Или подтянуть уровень знаний. Задача то - нетривиальная, раз поиск решения - не увенчался...
Можно еще попробовать "решить проблему в корне", т.е. добиться изменения способа сбора информации изначально. Чтобы сразу предоставлялся файл в формате "как надо", а не "как есть".
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Цитата
Михаил Лебедев написал:
Можно еще попробовать "решить проблему в корне", т.е. добиться изменения способа сбора информации изначально.
Способ отражения информации изменить не получится, т.к. эти 3 столбца только часть большей таблицы,  данные в которой являются результатом работы исполнителя, а не просто сводятся из данных других источников и изменение способа представления информации приведет к усложнению и увеличению сроков работы исполнителя (придется постоянно объединять/разъединять ячейки в других столбцах).

По поводу остального согласен, что задача нетривиальная - попробую еще поискать, т.к. больше самому интересно и наличие решения не является критичным для работы, но может ее упростить для других пользователей.
Изменено: Regi27 - 24.01.2020 09:50:22
 
ОК. Осталось еще 3 способа.
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
.
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    #"Added Index1" = Table.AddIndexColumn(Source, "Индекс", 0, 1),
    #"Grouped Rows" = Table.Group(#"Added Index1", {"Индекс"}, {{"temp", each _, type table}})[[temp]][[temp]],
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "temp2", each [#"Added Custom" = Table.AddColumn([temp], "a", each Record.FieldValues(_)),
    #"Changed Type" = Table.TransformColumns(#"Added Custom",{{"a", each List.Transform(_,  each Text.Split(Text.From(_),"#(lf)"))}})[[a]],
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Индекс", 0, 1),
    #"Expanded {0}" = Table.ExpandListColumn(#"Added Index", "a"),
    #"Added Index2" = Table.AddIndexColumn(#"Expanded {0}", "Индекс.1", 1, 1),
    #"Expanded {0}1" = Table.ExpandListColumn(#"Added Index2", "a"),
    #"Duplicated Column" = Table.DuplicateColumn(#"Expanded {0}1", "a", "a1"),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Duplicated Column", "a1", Splitter.SplitTextByEachDelimiter({". "}, QuoteStyle.Csv, false), {"a.1", "a.2"}),
    #"Split Column by Delimiter1" = Table.ExpandListColumn(Table.TransformColumns(#"Split Column by Delimiter", {{"a.1", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "a.1"),
    #"Added Custom1" = Table.AddColumn(#"Split Column by Delimiter1", "Пользовательская", each try {Text.BeforeDelimiter([a.1], "-")..Text.AfterDelimiter([a.1], "-")} otherwise null),
    #"Expanded {0}2" = Table.ExpandListColumn(#"Added Custom1", "Пользовательская"),
    #"Filtered Rows" = Table.SelectRows(#"Expanded {0}2", each ([Индекс.1] <> 4)),
    #"Added Conditional Column" = Table.AddColumn(#"Filtered Rows", "a2", each if [Пользовательская] = null then try Number.From([a.1]) otherwise 1 else Number.From([Пользовательская])),
    #"Added Conditional Column1" = Table.AddColumn(#"Added Conditional Column", "a3", each if [a.2] = null then [a] else [a.2]),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Conditional Column1",{"a3", "a2", "Индекс.1"}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Removed Other Columns", {{"Индекс.1", type text}}, "ru-RU"), List.Distinct(Table.TransformColumnTypes(#"Removed Other Columns", {{"Индекс.1", type text}}, "ru-RU")[Индекс.1]), "Индекс.1", "a3")]
    [#"Pivoted Column"])[[temp2]],
    #"Expanded {0}" = Table.ExpandTableColumn(#"Added Custom", "temp2", {"a2", "1", "2", "3"}, {"a2", "1", "2", "3"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Expanded {0}",{{"3", type datetime}}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Changed Type",{{"3", type date}})
in
    #"Changed Type1"
 
Еще можно так:
Код
let
    Source = Table.AddIndexColumn( Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content], "Индекс", 0, 1),
    Split1 = Table.ExpandListColumn(Table.TransformColumns(Source[[Индекс],[Задача]], {{"Задача", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Задача"),
    Key1 = Table.AddColumn(Split1, "Номер строки", each Number.From( Text.BeforeDelimiter([Задача], ". ", {0, RelativePosition.FromEnd}) ), type number),
    Split2 = Table.ExpandListColumn(Table.TransformColumns(Source[[Индекс],[Исполнитель]], {{"Исполнитель", Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Исполнитель"),
    KeysList = Table.AddColumn(Split2, "Номер строки", each Expression.Evaluate( "{" & Text.Replace( Text.BeforeDelimiter([Исполнитель], ". ", {0, RelativePosition.FromEnd}), "-", ".." ) & "}" ) , type list),
    Key2 = Table.ExpandListColumn( Table.TransformColumns(KeysList, {{"Исполнитель", each Text.AfterDelimiter(_, ". ", {0, RelativePosition.FromEnd}), type text}}), "Номер строки"),
    Split3 = Table.ExpandListColumn(Table.TransformColumns(Source[[Индекс],[Срок исполнения]], {{"Срок исполнения", (x)=>Splitter.SplitTextByDelimiter("#(lf)", QuoteStyle.Csv)(Text.From(x)), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Срок исполнения"),
    Split4 = Table.SplitColumn(Split3, "Срок исполнения", (x)=>Splitter.SplitTextByEachDelimiter({". "}, QuoteStyle.Csv, true)(if Text.Contains(x, ". ") then x else ". " & x ), {"Номер строки", "Срок исполнения"}),
    Key3 = Table.ExpandListColumn( Table.TransformColumns(Split4, {{"Номер строки", each Expression.Evaluate( "{" & Text.Replace( _, "-", ".." ) & "}" ), type list}}), "Номер строки"),
    MergedQueries = Table.Join( Table.Join( Key1, {"Индекс", "Номер строки"}, Key2, {"Индекс", "Номер строки"} ), {"Индекс", "Номер строки"}, Key3, {"Индекс", "Номер строки"} ),
    RemovedColumns = Table.RemoveColumns( Table.Sort( MergedQueries, {{"Индекс", Order.Ascending}, {"Номер строки", Order.Ascending}} ), {"Индекс", "Номер строки"} ),
    Result = Table.TransformColumns(RemovedColumns, {{"Срок исполнения", each Date.From( Text.BeforeDelimiter(_, " ") ), type date}})
in
    Result
Вот горшок пустой, он предмет простой...
 
artyrH, здравия вам.
#"Grouped Rows" = Table.Group(#"Added Index1", {"Индекс"}, {{"temp", each _, type table}})[[temp]][[temp]]

первый  "[[temp]]" отсекает столбец Индекс, а зачем второй раз вы добавляете  "[[temp]]"? на что это влияет?
пробовал убирать, ничего визуально не изменилось и вроде как все работает и без добавления?

Благодарю  
Страницы: 1
Наверх