使用数据流从 Excel 中的单个工作表中拆分多个表

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

需要从 Excel(.xlsx) 文件中同一工作表中的多个表中提取数据。每个表的列名上方都有一个不同的标题,并且每个表都以“总计”行结尾(不需要总计行)。目前我需要从此文件中提取 3 个表,但将来还会添加第 4 个表,也需要提取该表。我还有该表的标题和列名。单元格范围不固定,下一个文件中的行可以增加或减少,因此需要动态选取表格。

输出需要是一个大表,其中包含所有 3 个表中的所有不同列以及第 4 个表中的列(当源文件中可用时)。

我正在尝试数据流,但无法提取表格。如果有解决方案,我也愿意在 ADF 或 Synapse 上工作。

示例输入如下所示(所有表格都在同一张表中):

试算表
帐号 原始余额 当前余额 利率 原始日期
546172 2354673 231473 10% 2023年7月3日
758682 2375764 137487 9% 2020年9月9日
536357 6473635 474661 13% 2022年5月11日
总计 658496 784651
拖欠报告
帐号 原始余额 当前余额 下一个截止日期
546172 2354673 231473 2024年7月3日
536357 6473635 474661 2024年9月9日
758682 2375764 137487 11-05-2024
总计 658496 784651
azure azure-data-factory extract apache-synapse
1个回答
0
投票

您可以使用具有 pandas 功能的 synapse 笔记本来组合所有表格。

下面我给出了 excel 文件中 2 个表格的示例,类似地,您可以更改以下代码以获取更多表格。

df = pd.read_excel("https://vjgsblob.blob.core.windows.net/data/csvs/extracted_data.xlsx?sp=r&st=2024-09-13T07:07:11Z&se=2024-09-13T15:07:11Z&spr=https&sv=2022-11-02&sr=b&sig=2AmroznyDPtH5boSZym8yxpLibsD0X4te18Phj%2BpAxc%3D").dropna(how='all').dropna(axis=1, how='all')
df = df.reset_index(drop=True)
df.columns = [f'col{i}' for i,j in enumerate(df.columns)]

# Getting the column names where table name indicator presents
trialBalancCol = [col for col in df.columns if df[col].str.contains('Trial Balance', na=False).any()][0]
deliquencyReportCol = [col for col in df.columns if df[col].str.contains('Deliquency Report', na=False).any()][0]

# Getting the position, which is used to split them.
trialBalance = df[df[trialBalancCol]=='Trial Balance'].index[0]
deliquencyReport = df[df[deliquencyReportCol]=='Deliquency Report'].index[0]
print(trialBalance,deliquencyReport)

#splitting the tables

dfTrialBalance = df[(df.index>trialBalance) & (df.index<deliquencyReport)].dropna(how='all').dropna(axis=1, how='all')
dfDeliquencyReport = df[df.index>deliquencyReport].dropna(how='all').dropna(axis=1, how='all')

#Removing total row
totalCol = [col for col in dfTrialBalance.columns if dfTrialBalance[col].str.contains('total', na=False).any()][0]
dfTrialBalance = dfTrialBalance[df[totalCol]!='total']
totalCol = [col for col in dfDeliquencyReport.columns if dfDeliquencyReport[col].str.contains('total', na=False).any()][0]
dfDeliquencyReport = dfDeliquencyReport[df[totalCol]!='total']

# Creating the column names
dfTrialBalance.columns =  dfTrialBalance.head(1).values.flatten().tolist()
dfDeliquencyReport.columns =  dfDeliquencyReport.head(1).values.flatten().tolist()

#Removing the column name row and resetting the index
dfTrialBalance = dfTrialBalance.iloc[1:].reset_index(drop=True)
dfDeliquencyReport = dfDeliquencyReport.iloc[1:].reset_index(drop=True)

#Joining the tables
ResTable = pd.merge(dfTrialBalance,dfDeliquencyReport,on='Acc Number',how='left')
ResTable

执行完上述所有代码后,您可以将其以 csv 格式保存回存储帐户(

ResTable.to_csv(<path>)
)。

再次根据您的数据更改此代码。

输入: enter image description here

输出:

帐号 原创巴尔 当前巴尔 利率 原始日期 原始余额 当前余额 下一个截止日期
546172 2354673 231473 0.1 2023-07-03 00:00:00 2354673 231473 2024-07-03 00:00:00
758682 2375764 137487 0.09 2020-09-09 00:00:00 NaN NaN NaN
536357 6473635 474661 0.13 2022-11-05 00:00:00 6473635 474661 2024-09-09 00:00:00
© www.soinside.com 2019 - 2024. All rights reserved.