Power Query 问题:具有多个相同表格的 PDF 在合并到一个表格之前需要转置,我怎样才能有效地做到这一点?

问题描述 投票:0回答:1

大家好,在我开始之前,这是我想要完成的任务的浓缩版本。 我的目标是将一系列 PDF 表格转换为单行,然后将它们组合在一起形成一个大型数据库。

我有一个 PDF,其中包含一张图像,每页顶部都有一个摘要表。其中一些 PDF 的长度可达数百页,但每页都包含相同的信息;带有汇总表的图像。

每个表都是这样的(虚拟数据),这很好,因为它总是统一的。但由于表格的组织方式,在我可以很好地将所有标题及其下面各自的数据分组之前,需要进行一些转置和转换。

这是我正在使用的表格的示例。

A 栏 B 栏 C 栏 D 栏
客户# 1234-123 账户 9999999
批次# 123456789 金额 9999999
-------- -------- -------- --------
日期 年/月/日 -------- --------

我当前的解决方案是将所有表格作为单独的查询从源 PDF 中导入。

由于每个表的结构相同,因此我一直将转换应用于一个文件,然后复制高级编辑器查询并将其粘贴到其他表中。由于某种原因,当我进行原始导入时,助手示例文件无法工作...所以这就是我的解决方法。

至于表格转换。当前表在导入时看起来像这样。

A 栏 B 栏 C 栏 D 栏
客户# 1234-123 账户 9999999
-------- -------- -------- --------
批次# 123456789 金额 9999999
-------- -------- -------- --------
日期 年/月/日 -------- --------
-------- -------- -------- --------

但是在我的转换之后,我能够让它看起来像这样,这正是需要发生的事情。

A 栏 B 栏 C 栏 D 栏 E 栏
客户# 批次# 账号# 金额 日期
-------- -------- -------- -------- --------
1234-123 123456789 9999999 9999999 年/月/日

我通过首先转置表格来完成此操作,然后使用report.field公式添加两个自定义列,将帐户和金额信息拉入单独的行中,一旦结构健全,我就会删除底部多余的两行桌子。

完成此操作后(这是我试图在这篇文章中解决的部分),我使用高级编辑器复制查询并将其应用到所有其他表高级编辑器查询以重新创建步骤。

一旦所有表格看起来都一样,我就使用追加查询功能,然后去吃午饭哈哈。

虽然此解决方案确实有效,但某些 PDF 包含数百个表,这使得复制和粘贴查询非常繁琐,因为我需要在所有 100 个表中执行此操作。我曾尝试将整个 PDF 作为一个大表导入,但由于原始导入的标题被分成两列,转置变得更加困难。如果这就是我的解决方案所在,我已经包含了作为一个大表导入时数据导入的示例。

A 栏 B 栏 C 栏 D 栏
客户# 1234-123 账户 9999999
批次# 123456789 金额 9999999
-------- -------- -------- --------
日期 年/月/日 -------- --------
-------- -------- -------- --------
客户# 1234-123 账户 9999999
批次# 123456789 金额 9999999
-------- -------- -------- --------
日期 年/月/日 -------- --------

我意识到这是一个很大的要求,但如果有人有任何资源或解决方案可以分享,我将非常感激。

提前致谢。

pdf append powerquery
1个回答
0
投票

这将转换您的一张大桌子。它的工作原理是假设 A 列中有 Client 表示一个新部分

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom", each if Text.Contains([Column A],"Client") then [Index] else null),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Custom"}),
#"Grouped Rows" = Table.Group(#"Filled Down", {"Custom"}, {{"data", each 
    let Transform1 =Table.Skip(Table.DemoteHeaders(Table.SelectColumns(_,{"Column A", "Column B"})),1) &
            Table.Skip(Table.DemoteHeaders(Table.SelectColumns(_,{"Column C", "Column D"})),1),
    #"Filtered Rows" = Table.SelectRows(Transform1, each not Text.Contains([Column1] ,"----"))
in Table.PromoteHeaders(Table.Transpose(#"Filtered Rows")), type table }}),
Combine =Table.Combine(#"Grouped Rows"[data])
in  Combine

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.