处理省市区excel数据加工成SQL

原始数据相关内容链接

处理excel数据加工成SQL的脚本

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Excel行政区域数据转SQL脚本
- 支持特殊行政单位处理(如省直辖县级行政单位)
- 支持批量处理
"""import pandas as pd
import os
import redef process_excel_to_sql(excel_path, output_sql_path=None):"""将Excel行政区域数据转换为SQL插入语句Args:excel_path: Excel文件路径output_sql_path: 输出SQL文件路径,如果为None则打印到控制台"""try:# 读取Excel文件df = pd.read_excel(excel_path)print(f"读取Excel文件: {excel_path}")print(f"数据行数: {len(df)}")print(f"列名: {list(df.columns)}")# 检查必要的列是否存在required_columns = ['省份', '地级市', '县区', '级别']if not all(col in df.columns for col in required_columns):raise ValueError(f"Excel文件缺少必要的列: {required_columns}")# 获取省份名称province_name = df['省份'].iloc[0]print(f"正在处理: {province_name}")# 生成SQL语句sql_lines = []sql_lines.append("-- " + "=" * 60)sql_lines.append(f"-- {province_name}行政区域数据插入SQL")sql_lines.append("-- 适用表结构:sys_area (id, area_name, parent_id, area_level, sort_order)")sql_lines.append("-- " + "=" * 60)sql_lines.append("")# 设置省级变量province_clean = re.sub(r'[省市区县州盟地]', '', province_name)province_var = f"@{province_clean}_province_id"sql_lines.append("-- 设置变量")sql_lines.append(f"SET {province_var} = NULL;")# 处理市级数据 - 分离正常地级市和省直辖县级行政单位normal_cities = df[(df['级别'] == '地级市') & (df['地级市'] != '省直辖县级行政单位')]special_admin_units = df[(df['地级市'] == '省直辖县级行政单位') &(df['县区'].notna()) & (df['县区'] != '')]# 收集所有城市名称,为每个城市创建变量all_city_names = []if not normal_cities.empty:all_city_names.extend(normal_cities['地级市'].tolist())if not special_admin_units.empty:all_city_names.extend(special_admin_units['县区'].tolist())# 为每个城市生成变量名city_vars = {}for city_name in all_city_names:# 生成变量名,去除特殊字符var_clean = re.sub(r'[市区县州盟地族苗土家自治]', '', city_name)var_name = f"@{var_clean}_city_id"city_vars[city_name] = var_namesql_lines.append(f"SET {var_name} = NULL;")# 直辖市的情况is_municipality = len(all_city_names) == 1 and special_admin_units.emptyif is_municipality:city_var = f"@{province_clean}_city_id"sql_lines.append(f"SET {city_var} = NULL;")sql_lines.append("")# 1. 插入省级sql_lines.append("-- 1. 插入省级")sql_lines.append(f"INSERT INTO sys_area (area_name, parent_id, area_level, sort_order) VALUES ('{province_name}', 0, 1, 1);")sql_lines.append(f"SET {province_var} = LAST_INSERT_ID();")sql_lines.append("")# 2. 处理地级市all_cities_count = len(all_city_names)if all_cities_count > 0:sql_lines.append("-- 2. 插入地级市")city_sort = 1# 插入正常地级市if not normal_cities.empty:sql_lines.append("-- 2.1 正常地级市")for _, city_row in normal_cities.iterrows():city_name = city_row['地级市']city_var_name = city_vars[city_name]sql_lines.append(f"INSERT INTO sys_area (area_name, parent_id, area_level, sort_order) VALUES ('{city_name}', {province_var}, 2, {city_sort});")sql_lines.append(f"SET {city_var_name} = LAST_INSERT_ID();")# 如果是直辖市,同时设置通用变量if is_municipality:sql_lines.append(f"SET {city_var} = LAST_INSERT_ID();")city_sort += 1sql_lines.append("")# 处理省直辖县级行政单位,将其作为地级市if not special_admin_units.empty:sql_lines.append("-- 2.2 省直辖县级行政单位(作为地级市处理)")for _, special_row in special_admin_units.iterrows():special_city_name = special_row['县区']  # 县区列作为市名city_var_name = city_vars[special_city_name]sql_lines.append(f"INSERT INTO sys_area (area_name, parent_id, area_level, sort_order) VALUES ('{special_city_name}', {province_var}, 2, {city_sort});")sql_lines.append(f"SET {city_var_name} = LAST_INSERT_ID();")city_sort += 1sql_lines.append("")print(f"发现省直辖县级行政单位 {len(special_admin_units)} 个,已作为地级市处理")sql_lines.append(f"-- 总计地级市数量: {all_cities_count}个")sql_lines.append("")# 3. 处理区县# 正常区县(不包括省直辖县级行政单位下的)districts = df[(df['级别'] == '区县') & (df['地级市'] != '省直辖县级行政单位')]if not districts.empty:sql_lines.append("-- 3. 插入区县")if is_municipality:# 直辖市情况sql_lines.append("-- 直辖市区县")district_sort = 1for _, district_row in districts.iterrows():district_name = district_row['县区']sql_lines.append(f"INSERT INTO sys_area (area_name, parent_id, area_level, sort_order) VALUES ('{district_name}', {city_var}, 3, {district_sort});")district_sort += 1else:# 普通省份,需要按城市分组处理区县,使用变量避免子查询问题grouped = districts.groupby('地级市')for city_name, city_districts in grouped:if city_name != '省直辖县级行政单位' and city_name in city_vars:sql_lines.append(f"-- {city_name}下的区县")city_var_name = city_vars[city_name]district_sort = 1for _, district_row in city_districts.iterrows():district_name = district_row['县区']sql_lines.append(f"INSERT INTO sys_area (area_name, parent_id, area_level, sort_order) VALUES ('{district_name}', {city_var_name}, 3, {district_sort});")district_sort += 1sql_lines.append("")sql_lines.append("")# 统计信息province_count = 1city_count = all_cities_countdistrict_count = len(districts)sql_lines.append("")sql_lines.append("-- " + "=" * 60)sql_lines.append(f"-- 统计:省级{province_count}个,地级市{city_count}个,区县{district_count}个")if not special_admin_units.empty:sql_lines.append(f"-- 其中省直辖县级行政单位{len(special_admin_units)}个已作为地级市处理")sql_lines.append("-- 修复:使用变量替代子查询,避免MySQL错误")sql_lines.append("-- " + "=" * 60)# 输出结果sql_content = "\n".join(sql_lines)if output_sql_path:try:# 确保目录存在output_dir = os.path.dirname(output_sql_path)if output_dir and not os.path.exists(output_dir):os.makedirs(output_dir, exist_ok=True)print(f"创建目录: {output_dir}")# 写入文件with open(output_sql_path, 'w', encoding='utf-8') as f:f.write(sql_content)print(f"✓ SQL文件已保存到: {output_sql_path}")except PermissionError:print(f"❌ 权限错误:无法写入文件 {output_sql_path}")print("可能的解决方案:")print("1. 检查目录是否存在写权限")print("2. 尝试以管理员身份运行")print("3. 选择其他目录保存文件")print("4. 直接复制下面的SQL内容:")print("-" * 40)print(sql_content)print("-" * 40)except Exception as e:print(f"❌ 保存文件时出错: {e}")print("将在控制台显示SQL内容:")print("-" * 40)print(sql_content)print("-" * 40)else:print("\n生成的SQL语句:")print("-" * 60)print(sql_content)print("-" * 60)return sql_contentexcept Exception as e:print(f"❌ 处理Excel文件时出错: {e}")return Nonedef batch_process_excel_files(folder_path):"""批量处理文件夹中的所有Excel文件Args:folder_path: 包含Excel文件的文件夹路径"""if not os.path.exists(folder_path):print(f"❌ 错误:文件夹 {folder_path} 不存在")returnif not os.path.isdir(folder_path):print(f"❌ 错误:{folder_path} 不是一个目录")returnexcel_files = [f for f in os.listdir(folder_path) if f.endswith(('.xlsx', '.xls'))]if not excel_files:print("❌ 文件夹中没有找到Excel文件")returnprint(f"✓ 找到{len(excel_files)}个Excel文件:")for file in excel_files:print(f"  - {file}")# 创建sql子目录sql_folder = os.path.join(folder_path, 'sql')try:if not os.path.exists(sql_folder):os.makedirs(sql_folder, exist_ok=True)print(f"✓ 创建SQL输出目录: {sql_folder}")except PermissionError:print(f"⚠️ 无法创建SQL目录 {sql_folder},将保存到原目录")sql_folder = folder_pathexcept Exception as e:print(f"⚠️ 创建目录时出错: {e},将保存到原目录")sql_folder = folder_pathsuccess_count = 0fail_count = 0for excel_file in excel_files:excel_path = os.path.join(folder_path, excel_file)sql_file = excel_file.replace('.xlsx', '.sql').replace('.xls', '.sql')sql_path = os.path.join(sql_folder, sql_file)print(f"\n{'=' * 50}")print(f"处理文件: {excel_file}")print(f"{'=' * 50}")try:result = process_excel_to_sql(excel_path, sql_path)if result:print(f"✓ 成功处理: {excel_file}")success_count += 1else:print(f"❌ 处理失败: {excel_file}")fail_count += 1except Exception as e:print(f"❌ 处理失败: {excel_file} - {e}")fail_count += 1# 尝试只输出到控制台try:print("尝试只在控制台显示结果:")result = process_excel_to_sql(excel_path, None)if result:print("✓ 控制台显示成功")except Exception as e2:print(f"❌ 完全失败: {e2}")print(f"\n{'=' * 50}")print(f"批量处理完成")print(f"成功: {success_count} 个")print(f"失败: {fail_count} 个")print(f"{'=' * 50}")def validate_file_path(file_path):"""验证文件路径"""if not file_path:return False, "文件路径不能为空"# 去除可能的引号file_path = file_path.strip('"').strip("'")if not os.path.exists(file_path):return False, f"文件不存在: {file_path}"if not file_path.endswith(('.xlsx', '.xls')):return False, f"文件格式不正确,需要.xlsx或.xls文件: {file_path}"return True, file_pathdef validate_folder_path(folder_path):"""验证文件夹路径"""if not folder_path:folder_path = "./"# 去除可能的引号folder_path = folder_path.strip('"').strip("'")if not os.path.exists(folder_path):return False, f"目录不存在: {folder_path}"if not os.path.isdir(folder_path):return False, f"路径不是目录: {folder_path}"return True, folder_pathif __name__ == "__main__":print("=" * 60)print("Excel行政区域数据转SQL工具 v2.0")print("✅ 支持特殊行政单位处理(如省直辖县级行政单位)")print("✅ 修复MySQL子查询错误,使用变量替代")print("✅ 完善的权限错误处理")print("=" * 60)print()while True:print("选择处理方式:")print("1. 处理单个Excel文件")print("2. 批量处理文件夹中的所有Excel文件")print("3. 查看使用说明")print("4. 退出")choice = input("\n请选择 (1/2/3/4): ").strip()if choice == "1":print("\n" + "-" * 40)print("单文件处理模式")print("-" * 40)while True:file_path = input("请输入Excel文件路径: ").strip()is_valid, result = validate_file_path(file_path)if is_valid:file_path = resultbreakelse:print(f"❌ {result}")retry = input("是否重新输入? (y/n): ").strip().lower()if retry != 'y':breakif 'file_path' in locals() and os.path.exists(file_path):save_to_file = input("是否保存到SQL文件? (y/n): ").strip().lower()if save_to_file == 'y':sql_path = input("请输入SQL文件保存路径 (直接回车使用默认路径): ").strip()if not sql_path:base_name = os.path.splitext(file_path)[0]sql_path = base_name + '.sql'print(f"使用默认路径: {sql_path}")try:process_excel_to_sql(file_path, sql_path)except Exception as e:print(f"❌ 处理失败: {e}")show_console = input("是否在控制台显示结果? (y/n): ").strip().lower()if show_console == 'y':try:process_excel_to_sql(file_path, None)except Exception as e2:print(f"❌ 完全失败: {e2}")else:try:process_excel_to_sql(file_path, None)except Exception as e:print(f"❌ 处理失败: {e}")elif choice == "2":print("\n" + "-" * 40)print("批量处理模式")print("-" * 40)while True:folder_path = input("请输入文件夹路径 (直接回车使用当前目录): ").strip()is_valid, result = validate_folder_path(folder_path)if is_valid:folder_path = resultprint(f"使用目录: {os.path.abspath(folder_path)}")breakelse:print(f"❌ {result}")retry = input("是否重新输入? (y/n): ").strip().lower()if retry != 'y':breakif 'folder_path' in locals() and os.path.exists(folder_path):batch_process_excel_files(folder_path)elif choice == "3":print("\n" + "=" * 60)print("使用说明")print("=" * 60)print("1. Excel文件格式要求:")print("   - 必须包含列:省份、地级市、县区、级别")print("   - 支持.xlsx和.xls格式")print()print("2. 特殊处理说明:")print("   - 省直辖县级行政单位会被自动识别")print("   - 仙桃市、潜江市等会作为地级市处理")print("   - 直辖市会自动识别并正确处理")print()print("3. 生成的SQL特点:")print("   - 使用MySQL变量,避免子查询错误")print("   - 支持完整的三级行政区域结构")print("   - 包含详细的注释和统计信息")print()print("4. 常见问题:")print("   - 权限错误:尝试以管理员身份运行或选择其他目录")print("   - 文件格式错误:确保Excel文件包含必要的列")print("   - MySQL错误:新版本已修复子查询问题")print("=" * 60)elif choice == "4":print("\n感谢使用Excel转SQL工具!")breakelse:print("❌ 无效的选择,请输入 1、2、3 或 4")print()  # 添加空行,便于下次选择

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96094.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双碳目标下的24小时分时综合能源系统低碳优化调度:基于 Matlab/YALMIP/CPLEX的方法与仿真

在“双碳”战略目标的推动下,综合能源系统(Integrated Energy System, IES)已成为实现能源结构优化与碳排放控制的重要途径。本文以光伏、风电、燃气—电热联产(CHP)、燃气锅炉、电锅炉、电储能以及碳捕集(…

TDengine 选择函数 Last() 用户手册

LAST() 函数用户手册 函数定义 LAST(expr)功能说明 LAST() 函数统计表/超级表中某列的值最后写入的非 NULL 值,即返回时间戳最大的非 NULL 值。 版本要求 最低版本: v3.0.0.0 返回值 数据类型: 同应用的字段返回内容: 时间戳最大的非 NULL 值及其对应的时间戳…

< 自用文 学习 > 用 Claude Code 做一个日历

环境: OS: Windows 11 IDE:TREA Model: Sonnet / Qwen (免费 Token 用完) 参考: Claude Code Beginner Guide – Get Started in 20 Minutes (2025) by Alex Finn 油管博客 https://www.youtube.com/watch?viYiuzAsWnHU&listTLGG1L…

Gmail 数据泄露安全警报以及启示

目前,大规模数据泄露和针对性钓鱼攻击持续威胁着数十亿 Gmail 用户的安全,受ShinyHunters、UNC6040、UNC6395等威胁组织攻击,25 亿 Gmail 用户面临极大风险;攻击者已从暴力破解转向社会工程学与混合勒索,而密码复用、弱…

2024年6月GESPC++三级真题解析(含视频)

视频讲解:GESP2024年6月三级C真题讲解 一、单选题 第1题 解析: 答案C, 认证语言有C/C、Python、Scratch 第2题 解析: 答案B,判断闰年口诀“ 4闰 100不闰 400再闰 ” 第3题 解析: 答案C&#xff…

AiPPT生成的PPT内容质量怎么样?会不会出现逻辑混乱或数据错误?

作为一个每天要和 PPT 打交道的职场人,我用 AiPPT快一年了,从最初的 “试试看” 到现在的 “离不开”,最让我惊喜的就是它生成的 PPT 内容质量 —— 不仅逻辑清晰、数据专业,还能精准贴合不同场景需求,完全没遇到过逻辑…

DINOv3 新颖角度解释

1. Gram锚定(Gram Anchoring)的创新视角 新颖角度:oriane_simeoni(Meta AI研究人员)在X上分享了一个关于Gram锚定的深入线程,强调这一技术如何解决自监督学习中长期训练导致的特征图退化问题。 解释&#x…

【T2I】Discriminative Probing and Tuning for Text-to-Image Generation

paper:CVPR 2024 2403 https://arxiv.org/abs/2403.04321 code: https://github.com/LgQu/DPT-T2IAbstract 尽管文本到图像生成(T2I)取得了进展,但先前的方法往往面临文本 -图像对齐问题,例如生成图像中的关…

【CentOS7】使用yum安装出错,报HTTPS Error 404 - Not Found

【CentOS7】使用yum安装出错,报HTTPS Error 404 - Not Found问题描述解决办法博主有话说问题描述 在CentOS7中安装docker,切换了国内的镜像源进行yum安装,始终报如下错误:HTTPS Error 404 - Not Found 正在尝试其他镜像&#xff…

vulnhub:Kioptrix level 2

0x00、环境下载 链接:https://www.vulnhub.com/entry/kioptrix-level-11-2,23/ 0x01、前期准备 1.1、检查文件 hash值对比无误后解压 1.2、编辑虚拟机网卡 当不支持桥接时候,如练WiFi无无线网卡 方法1: 修改type为nat 方法2:将…

【CentOS7】docker安装成功后测试,报Unable to find image ‘hello-world:latest‘ locally

【CentOS7】docker安装成功测试,报Unable to find image hello-world:latest locally问题描述问题解决问题描述 根据大佬的博文【CentOS7】Linux安装Docker教程(保姆篇),以及结合之前的博文【CentOS7】使用yum安装出错&#xff0…

福彩双色球第2025104期篮球号码分析

明天是2025年9月9号星期二,深圳天气大雨。福彩双色球第2025104期篮球号码分析,上期开出篮球16,数字形式是1路球,合数偶数大号区域1字头数字。篮球1尾数01和11遗漏21期上次遗漏8期上上次遗漏7期,篮球3尾数03和13遗漏18期…

[手写系列]Go手写db — — 第三版(实现分组、排序、聚合函数等)

[手写系列]Go手写db — — 第三版第一版文章地址:https://blog.csdn.net/weixin_45565886/article/details/147839627 第二版文章地址:https://blog.csdn.net/weixin_45565886/article/details/150869791 🏠整体项目Github地址:ht…

狂想-机器人触感阵列理论验证方案

将方案改为使用**限制移动范围的半滚球**作为理论验证原型,是一个极具智慧且可行的降维策略,它将极大降低验证门槛,但同时会牺牲部分性能。### **方案转变后的核心变化**1. **原理替换**:从依赖**光学流**(拍摄表面纹理…

UNBIASED WATERMARK:大语言模型的无偏差水印

摘要1.背景与问题提出大语言模型(LLMs)的快速发展引发了对其可能被滥用的担忧。为降低这种风险,将水印技术融入大语言模型,以实现对模型输出的追踪和溯源成为一种思路。而此前研究认为,水印强度和模型输出质量之间存在…

MySQL——事务、MVCC

目录 什么是事务? 事务的四大特性 事务的隔离级别 事务的原理 redo log undo log MVCC实现原理 概念 隐藏字段 undo log版本链 readview 什么是事务? 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操…

光伏项目无人机踏勘--如何使用无人机自动航线规划APP

手机号免费注册iSolarBP,一起来学习吧,注册获取无人机航线规划APP https://isolar-bp.sungrowplant.com/isolarbp#/login?qrcodeId1952928161454551042https://isolar-bp.sungrowplant.com/isolarbp#/login?qrcodeId1952928161454551042 登录--下载航…

优先搜索(DFS)实战

目录 一、DFS通用解题思路 二、逐题拆解 三、四题对比 四、总结:DFS解决矩阵问题的“万能模板” 在算法解题中,矩阵连通性问题是高频考点,而深度优先搜索(DFS)是解决这类问题的核心工具之一。它通过“一条路走到…

门控MLP(Qwen3MLP)与稀疏混合专家(Qwen3MoeSparseMoeBlock)模块解析

Qwen3MLP Qwen3MLP是基于门控机制的MLP模块,采用了类似门控线性单元(GLU)的结构。它通过三个线性变换层(gate_proj、up_proj和down_proj)和SiLU激活函数,先将输入从隐藏维度扩展到中间维度,经过…

产线相机问题分析思路

现象:复现问题 原因:问题分析、溯源,定位根本原因; 方案:提出解决方案、规避措施 验证:导入、验证方案是否可行(先小批量、再大批量);一. 现象产线反馈4pcs预览又脏污、划…