Commit 0c285c0c by jiangdongchen

before combine

parent 15af78cf
......@@ -2,4 +2,5 @@
psrc/__pycache__/
psrc/stage1/__pycache__/
psrc/stage2/__pycache__/
Papers/
json/
\ No newline at end of file
......@@ -1779,3 +1779,7 @@
2025-05-09 07:14:21,653 - INFO - 是
2025-05-09 07:14:22,729 - INFO - Matched: 获取访存依赖_并发程序动态分析基础技术综述.pdf.pdf -> idx: 37, excel_name:  获取访存依赖: 并发程序动态分析基础技术综述
2025-05-09 07:14:22,729 - INFO - Change: 获取访存依赖_并发程序动态分析基础技术综述.pdf.pdf -> 37-获取访存依赖_并发程序动态分析基础技术综述.pdf
2025-05-09 13:16:29,040 - INFO - 程序启动,日志文件保存在: C:\Users\17046\Documents\papertools\logs\citation_process.log
2025-05-09 13:16:29,535 - INFO - Processing sheet: j20
2025-05-09 13:16:29,546 - WARNING - No BibTeX entry found in sheet j20 row 3
2025-05-09 13:16:29,547 - INFO - Processing 10331530.pdf
No preview for this file type
No preview for this file type
# Siming Lan
# 导入必要的库
import pandas as pd # 数据处理
import re # 正则表达式
import xlwings as xw # Excel操作
from openpyxl import load_workbook # Excel文件操作
from openpyxl.utils.dataframe import dataframe_to_rows # DataFrame转Excel行
import pdb # 调试工具
# 定义输入输出文件名
input_name = 'j24_target.xlsx' # 输入文件基础名
input_file = input_name + '.xlsx' # 输入Excel文件名
output_file = input_name + '-qiye.xlsx' # 输出Excel文件名
def find_header_rows(file_path):
"""
查找Excel文件中每个工作表的表头行
参数:
file_path: Excel文件路径
返回:
字典: {工作表名: 表头行号}
"""
workbook = xw.Book(file_path) # 打开Excel文件
header_rows_dict = {} # 存储结果
for sheet in workbook.sheets: # 遍历所有工作表
header = None
# 检查前5行是否有"序号"列(用于确定表头位置)
for row in range(1, 6):
if sheet.range(f'A{row}').value == "序号":
header = row - 1 # 表头行是"序号"所在行的上一行
break
header_rows_dict[sheet.name] = header # 记录表头行号
workbook.close() # 关闭Excel文件
return header_rows_dict
# 读取知名企业列表Excel文件
famous_companies_df = pd.read_excel("知名企业5.8.xlsx")
company_dict = {} # 存储企业名和别名的字典,格式: {企业名/别名: 索引}
# 构建企业名称字典
for idx, row in famous_companies_df.iterrows():
company_name = row["企业名"] # 获取企业名
aliases = row.get("别名", "") # 获取别名(可能为空)
# 处理别名(按分号分隔)
if isinstance(aliases, str):
aliases = aliases.split(';')
else:
aliases = []
# 添加企业名到字典(索引从1开始)
company_dict[company_name.strip()] = idx + 1
# 添加所有别名到字典(指向同一个索引)
for alias in aliases:
alias = alias.strip()
if alias: # 跳过空别名
company_dict[alias] = idx + 1
# 存储处理结果
results = {}
# 获取输入文件中所有工作表的表头行号
header_rows = find_header_rows(input_file)
def process_column_name(col_name):
"""处理列名: 去除换行符和首尾空格"""
return col_name.replace('\n', '').strip()
# 处理每个工作表
for sheet_name, header in header_rows.items():
# 读取Excel工作表(跳过表头行)
df = pd.read_excel(input_file, sheet_name=sheet_name, header=header)
# 处理列名: 去除换行符和空格
df.columns = [process_column_name(col) for col in df.columns]
# 检查必要列是否存在
required_columns = ["引文机构", "知名企业名称(参考知名企业列表)", "引文机构在知名企业中的索引"]
if not all(col in df.columns for col in required_columns):
print(f"跳过 {sheet_name}:缺少必要列")
continue # 跳过缺少必要列的工作表
# 初始化结果列表
company_names_list = [] # 存储匹配的企业名称
company_indexes_list = [] # 存储匹配的企业索引
# 处理每一行数据
for _, row in df.iterrows():
# 分割"引文机构"列(按分号或换行符), 并过滤空值
institutions = [inst for inst in re.split(r'[;\n]', str(row["引文机构"]).strip()) if inst]
names = [] # 存储当前行匹配的企业名
indexes = [] # 存储当前行匹配的企业索引
# 处理每个机构名称
for inst in institutions:
inst_clean = inst.strip()
# 处理中文逗号,避免影响匹配
inst_clean = inst_clean.replace(",", ",")
inst_clean = inst_clean.replace(",", " , ").strip()
# 标志是否匹配到企业
matched = False
# 遍历企业字典进行匹配
for company in company_dict:
# 判断企业名是否包含英文字母
if re.search(r'[a-zA-Z]', company):
# 英文企业名匹配: 前后必须是单词边界(防止部分匹配)
pattern = r'(^|\s)' + re.escape(company) + r'(\s|$)'
if re.search(pattern, inst_clean):
names.append(company)
indexes.append(str(company_dict[company]))
matched = True
break
else:
# 中文企业名匹配: 直接包含判断
if company in inst_clean:
names.append(company)
indexes.append(str(company_dict[company]))
matched = True
break
# 如果没有匹配到企业
if not matched:
names.append("") # 空字符串表示未匹配
indexes.append("无") # "无"表示未匹配
# 将当前行的匹配结果拼接成字符串
company_names = ";".join([n for n in names if n]) # 过滤空名称
company_indexes = ";".join(indexes)
company_names_list.append(company_names)
company_indexes_list.append(company_indexes)
# 更新DataFrame
df["知名企业名称(参考知名企业列表)"] = company_names_list
df["引文机构在知名企业中的索引"] = company_indexes_list
# 保存处理后的结果
results[sheet_name] = df
# 加载源文件(用于保留格式)
wb = load_workbook(input_file)
# 创建新的Excel文件
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
# 处理每个工作表
for sheet_name, df in results.items():
# 获取源工作表
source_sheet = wb[sheet_name]
# 创建新工作表
dest_sheet = writer.book.create_sheet(sheet_name)
# 复制第一行第一列的内容和格式(通常是标题)
source_cell = source_sheet.cell(row=1, column=1)
dest_cell = dest_sheet.cell(row=1, column=1)
dest_cell.value = source_cell.value
if source_cell.font.color:
dest_cell.font = source_cell.font.copy() # Updated to use the recommended copy method
dest_cell.font.color = source_cell.font.color # Set color separately
# 将DataFrame写入Excel
for r_idx, row in enumerate(dataframe_to_rows(df, index=False, header=True), start=2):
for c_idx, value in enumerate(row, start=1):
dest_cell = dest_sheet.cell(row=r_idx, column=c_idx)
dest_cell.value = value
# 设置活动工作表(与源文件相同)
if wb.active:
writer.book.active = writer.book[wb.active.title]
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment