ifind

import os
import pandas as pd
from typing import Dict, List

def load_excel_data(folder_path: str) -> Dict[str, List[Dict]]:
    """
    加载指定文件夹下所有Excel文件的关键数据
    :param folder_path: 文件夹路径
    :return: 字典,key=文件名,value=每行数据(包含B/C/E列+行号)
    """
    all_data = {}
    # 遍历文件夹下所有Excel文件(.xlsx/.xls)
    for filename in os.listdir(folder_path):
        if not filename.endswith((".xlsx", ".xls")):
            continue  # 跳过非Excel文件
        
        file_path = os.path.join(folder_path, filename)
        try:
            # 读取Excel文件,以字符串格式避免数字/文本混淆
            # header=None:无表头时用(若有表头可删除,或指定header=0)
            df = pd.read_excel(file_path, dtype=str, header=None)
            file_data = []
            
            # 遍历每一行(跳过空行)
            for row_idx, row in df.iterrows():
                # 提取列:第二列(索引1)、第三列(索引2)、第五列(索引4)
                col2 = row.iloc[1] if len(row) > 1 else ""  # B列
                col3 = row.iloc[2] if len(row) > 2 else ""  # C列
                col5 = row.iloc[4] if len(row) > 4 else ""  # E列
                
                # 跳过空数据
                if pd.isna(col5) or col5.strip() == "":
                    continue
                
                # 拆分第五列的多标识(如"R1,R2,C2"拆分为["R1","R2","C2"])
                flags = [flag.strip() for flag in col5.split(",") if flag.strip()]
                if not flags:
                    continue
                
                # 保存该行数据
                file_data.append({
                    "row_num": row_idx + 1,  # 行号(Excel中从1开始)
                    "col2": col2.strip() if not pd.isna(col2) else "",
                    "col3": col3.strip() if not pd.isna(col3) else "",
                    "flags": flags
                })
            
            all_data[filename] = file_data
            print(f"✅ 成功加载文件:{filename},有效数据行:{len(file_data)}")
        
        except Exception as e:
            print(f"❌ 读取文件{filename}失败:{e}")
            continue
    
    if not all_data:
        print("⚠️  文件夹下未找到有效Excel文件或数据")
    return all_data

def search_flag(all_data: Dict, target_flag: str) -> None:
    """
    根据输入的标识(如R1/C2)查询并打印对应行的第二、三列信息
    :param all_data: 加载的Excel数据
    :param target_flag: 要查询的标识(如R1、C2)
    """
    target_flag = target_flag.strip()
    if not target_flag:
        print("⚠️  请输入有效的标识(如R1、C2)")
        return
    
    # 记录匹配结果
    match_count = 0
    print(f"\n========== 查找标识「{target_flag}」的结果 ==========")
    
    # 遍历所有文件的所有行
    for filename, file_data in all_data.items():
        for row_info in file_data:
            if target_flag in row_info["flags"]:
                match_count += 1
                print(f"文件:{filename} | 行号:{row_info['row_num']}")
                print(f"第二列:{row_info['col2']} | 第三列:{row_info['col3']}\n")
    
    if match_count == 0:
        print(f"❌ 未找到包含标识「{target_flag}」的记录")
    else:
        print(f"✅ 共找到 {match_count} 条匹配记录")

def main():
    # 配置:修改为你的文件夹路径(绝对路径/相对路径均可)
    FOLDER_PATH = "./excel_files"  # 示例:当前目录下的excel_files文件夹
    # FOLDER_PATH = "/home/user/excel_data"  # Linux绝对路径
    # FOLDER_PATH = "C:/Users/xxx/Documents/excel_data"  # Windows绝对路径
    
    # 第一步:加载所有Excel数据
    print("开始加载Excel文件数据...")
    all_data = load_excel_data(FOLDER_PATH)
    if not all_data:
        return
    
    # 第二步:控制台交互查询
    print("\n========== 进入查询模式 ==========")
    print("输入要查询的标识(如R1、C2),输入'q'退出")
    while True:
        target_flag = input("\n请输入查询标识:")
        if target_flag.lower() == "q":
            print("退出程序...")
            break
        # 执行查询
        search_flag(all_data, target_flag)

if __name__ == "__main__":
    main()

 

posted @ 2026-03-13 17:39  为鲸  阅读(13)  评论(0)    收藏  举报