處理省市區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
英文地址,請注明出處:http://en.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預覽又臟污、劃…