将CSV、Excel、XML文件转换为MySQL数据库

在平时的工作中,经常会遇到需要将文件数据导入到数据库中的情况。有些客户之前可能只使用Excel表格作为记录工具,但当数据量达到一定程度或者需要将数据导入到其他系统中时,就会很emo,因为Excel表格虽然方便,但在数据处理和管理方面却存在很多限制。此时就需要将Excel表格中的数据导入到MySQL数据库中,以便更好地管理和利用这些数据。除了Excel表格,有时还需要处理CSV或XML格式的数据,比如某些数据源或第三方平台获取的数据可能就是这两种格式,我遇到过某设备导出的数据为欧洲千分位CSV的格式,用户自己处理起来就更emo了。

给MySQL数据库读取文件赋权

在进行转换前需要先给MySQL数据库赋权,因为MySQL服务器通常配置了一个安全选项,限制了LOAD DATA INFILE语句可以加载文件的目录。这个--secure-file-priv选项就是用于限制LOAD DATA INFILESELECT ... INTO OUTFILE操作可以访问的文件目录。

赋权需要先输入命令查看--secure-file-priv指定的目录路径,随后使用cp命令将要转换的CSV、Excel(需要转化为CSV文件)文件移动到这个路径下:

sql 复制代码
SHOW VARIABLES LIKE 'secure_file_priv';

复制文件到查询到的/var/lib/mysql-files/文件夹里(Amazon Dataset.csv是我从kaggle上下载的CSV文件名称):

bash 复制代码
sudo cp "/数据文件存放的路径/Amazon Dataset.csv" "/var/lib/mysql-files/"

赋予MySQL读取文件的权利:

bash 复制代码
sudo chown mysql:mysql "/var/lib/mysql-files/Amazon Dataset.csv"
bash 复制代码
sudo chmod 640 "/var/lib/mysql-files/Amazon Dataset.csv"

重启MySQL服务器:

bash 复制代码
sudo systemctl restart mysql

CSV文件转换

接下来就可以创建MySQL数据库了,根据原数据格式来建立

sql 复制代码
CREATE DATABASE amazon;  
USE amazon;

CREATE TABLE IF NOT EXISTS daily_prices (  
    Date DATE PRIMARY KEY,  
    Open FLOAT,  
    High FLOAT,  
    Low FLOAT,  
    Close FLOAT,  
    Adj_Close FLOAT,  
    Volume BIGINT  
);

接下来进行数据读取和转换:CSV文件以 , 作为分割,所以使用FIELDS TERMINATED BY ','提示数据库原文件是,分割格式,ENCLOSED BY '"'指定每个字段的值都应该在双引号内,LINES TERMINATED BY '\n'指定每条记录之间的分隔符是换行符(\n),IGNORE 1 ROWS;指定指定导入数据时忽略文件的第一行。

sql 复制代码
LOAD DATA INFILE '/var/lib/mysql-files/Amazon Dataset.csv'  
INTO TABLE daily_prices  
FIELDS TERMINATED BY ','  
ENCLOSED BY '"'  
LINES TERMINATED BY '\n'  
IGNORE 1 ROWS;

查询下数据库是否转换成功:

sql 复制代码
SELECT * FROM daily_prices;

Excel文件转换

安装gnumeric将xls或xlsx文件转换为.csv文件

bash 复制代码
udo apt-get install gnumeric

安装完gnumeric后,使用ssconvert命令来将.xls文件转换为.csv文件:

bash 复制代码
ssconvert 数据.xls 数据.csv

随后既可以像操作CSV文件一样进行操作。

XML文件转换

我从国家数据官网下载的XML格式数据,官网链接:国家数据官网,在下载完数据后先看一下数据结构

根据数据结构来建立一个数据库:

sql 复制代码
CREATE DATABASE month_data;  
USE month_data;  
  
CREATE TABLE monthly (  
    id INT AUTO_INCREMENT PRIMARY KEY,  
    indicator VARCHAR(255),  
    time VARCHAR(255),  
    data DECIMAL(10, 2)  
);

接下来编写Python脚本,需要提前下载lxml库lxml库相对于xml库更灵活方便,处理编码方式效果更好:

python 复制代码
# import_xml.py
from lxml import etree 
import mysql.connector  
  
conn = mysql.connector.connect(  
    host='主机名',  
    user='用户名',  
    password='用户密码',  
    database='database的名字'  
)  
cursor = conn.cursor()  
tree = etree.parse('network.xml')  
root = tree.getroot() 
  
for record in root.findall('data/record'):  
    indicator = record.find('field[@name="指标"]').text  
    time = record.find('field[@name="时间"]').text  
    data = record.find('field[@name="数据"]').text  
      
    cursor.execute(  
        "INSERT INTO monthly (indicator, time, data) VALUES (%s, %s, %s)",  
        (indicator, time, data)  
    )  
  
conn.commit()  
cursor.close()  
conn.close()

随后在终端运行它:

bash 复制代码
python3 import_xml.py

运行成功后查询一下:

sql 复制代码
SELECT * FROM monthly;

转换成功!

相关推荐
HUGu RGIN14 分钟前
MySQL--》如何在MySQL中打造高效优化索引
android·mysql·adb
HackTwoHub2 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
l1t2 小时前
DeepSeek总结的DuckLake构建基于 SQL 原生表格式的下一代数据湖仓
数据库·sql
KmSH8umpK2 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第八篇
数据库·redis·分布式
TDengine (老段)2 小时前
从施工监测到运营预警,桥科院用 TDengine 提升桥梁数据管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
S1998_1997111609•X3 小时前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
开开心心就好4 小时前
仅168KB的桌面图标自动隐藏工具
windows·计算机视觉·计算机外设·excel·启发式算法·宽度优先·csdn开发云
KmSH8umpK4 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第七篇
数据库·redis·分布式
yaodong5185 小时前
不会Python也能数据分析:Gemini 3.1 Pro解决办公问题的SQL自动生成
python·sql·数据分析
BU摆烂会噶5 小时前
【LangGraph】持久化实现的三大能力——时间旅行
数据库·人工智能·python·postgresql·langchain