Есть pdf файлы, при импорте которых PQ некоторые ячейки с многострочным содержимым разбивает на несколько строк (записей). Не понимаю почему он так делает (другие, похожие, ячейки правильно понимает), но управлять этим при импорте я, как понимаю, не могу, поэтому встает задача как объединить их обратно при дальнейшей обработке. Каким способом это лучше сделать? В приложенных файлах пример такого pdf файла и скрин, поясняющий проблему.
let Source = Pdf.Tables(File.Contents("путь_к_файлу\Пример.pdf"), [Implementation="1.3"]), tbl = Table.PromoteHeaders(Table.Combine(Table.SelectRows(Source, (x) => x[Kind] = "Table")[Data])), transformations = List.Transform(List.Skip(Table.ColumnNames(tbl)), (x) => {x, (w) => Text.Combine(Table.Column(w, x))}), group = Table.Group(tbl, "№ п/п", transformations, GroupKind.Local, (s, c) => Number.From(c <> null)) in group
Пришелец-прораб.
Пользователь
Сообщений: Регистрация: 18.03.2018
03.04.2026 19:45:00
AlienSx, отлично работает, спасибо! Осталось мне разобраться как это получилось
Пользователь
Сообщений: Регистрация: 18.03.2018
03.04.2026 20:02:26
AlienSx, а где то можно почитать разбор трюка, который вы применили? Пока что то никак не разберусь
Пользователь
Сообщений: Регистрация: 10.01.2023
Excel 365
03.04.2026 21:15:26
Yup, здесь нет никакого трюка. Как и написал выше, это группировка и операция(-и) с полученными в результате группировки таблицами. Прежде всего, матчасть: . Детальный разбор этой функции можно найти . А дальше - дело техники. Нам надо группировать строки по номеру, который "п/п". Это будет 2м агрументом Table.Group. Когда он не пуст - начинаем новую группу. С этим справятся 4й (GroupKind.Local) и 5й аргументы Table.Group. И теперь остается правильно составить 3й аргумент. Это список из элементов {название_столбца, функция_обработки_таблицы_группы} Нам надо получить все оригинальные столбцы, кроме первого (он уже получен как 2й аргумент). Это List.Skip(Table.ColumnNames(tbl)). Далее этот список надо преобразовать в то, что хочет от нас Table.Group в качестве 3го аргумента. Преобразование элементов списка - List.Transform. В каждом таком преобразовании получаем список из 2х элеметнов (см выше про 3й аргумент) - название столбца (собственно элемент списка) и функция преобразования соответствующего столбца таблицы. Чтобы доступиться к столбцу по имени используем Table.Column. В рез-те получается Text.Combine(Table.Column(имя_таблицы, имя_столбца)). То есть результатом работы Table.Group будет таблица с теми же названиями столбцов, что и оригинальная таблица, только значения в них будут "объединенные" при помощи Text.Combine текстовые значения. Вот и весь "трюк", описание которого заняло раз в 5 больше времени, чем написание кода.
Изменено: - 04.04.2026 09:11:20
Пришелец-прораб.
Пользователь
Сообщений: Регистрация: 18.03.2018
04.04.2026 11:14:43
AlienSx, потрясающе! Более-менее смысл понятен, но самому так свободно оперерировать сущностями - расти мне еще и расти. Но обязательно поглубже разберусь и изучу метод, так как, на вскидку, очень много возникающих задач им решить множно. Огромное спасибо!