MySQL数据库导入Excel表格及TXT文件

实验目的

将Windows下的excel表格及txt文本导入MySQL数据库

实验环境

RockyLinux9.2的系统,yum安装的MySQL8.0版本数据库

[root@localhost ~]# cat /etc/redhat-release 
Rocky Linux release 9.2 (Blue Onyx)
[root@localhost ~]# mysql -V
mysql  Ver 8.0.32 for Linux on x86_64 (Source distribution)

1、把Excel表格文件另存为CSV

常规的Excel表格基本都是老版本xls或者新的xlsx格式,是不支持直接导入MySQL数据库的,需要先转换文件为CSV格式,也就是英文逗号分割格式,自己新建个txt文件然后用逗号分割改成csv也可以。


2、创建数据库(database)及表(table)

安装mysql并且设置密码


yum install mysql-server -y
systemctl enable mysqld --now
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypasswd';
exit;

新建数据库,再新建一个和Excel表格一模一样列的数据库表,表格有几列就要在数据库对应

登录MySQL

mysql -u root -p

查看现有数据库情况

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

创建数据库,名称是ip

mysql> create database ip;
Query OK, 1 row affected (0.01 sec)


切换到刚新建的ip这个数据库

mysql> use ip;
Database changed


查看切换数据库是否成功,当前在哪个数据库下面

mysql> SELECT DATABASE();
+------------+
| DATABASE() |
+------------+
| ip         |
+------------+
1 row in set (0.00 sec)

可以看到在ip数据库下,这里不得不表扬一下mariadb数据库,切换了数据库是会自己显示的,不需要这一步操作

创建一个表,名称是xuniji

mysql> CREATE TABLE xuniji ( IP地址 VARCHAR(255), 系统 VARCHAR(255), 用途 VARCHAR(255) );
Query OK, 0 rows affected (0.01 sec)


查看表情况

mysql> show tables;
+--------------+
| Tables_in_ip |
+--------------+
| xuniji       |
+--------------+
1 row in set (0.00 sec)


描述表的内容

mysql> describe xuniji;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| IP地址   | varchar(255) | YES  |     | NULL    |       |
| 系统     | varchar(255) | YES  |     | NULL    |       |
| 用途     | varchar(255) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

表就创建好了,下一步就是导入Excel表格

3、导入

接上文,使用如下命令导入

LOAD DATA INFILE '/path/to/csv/file' INTO TABLE tablename FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS;

上述命令中,'/path/to/csv/file'是CSV文件的路径,tablename是你要导入数据的表名。FIELDS TERMINATED BY ','表示各列之间使用逗号分隔,LINES TERMINATED BY '\n'表示行末使用换行符。IGNORE 1 ROWS表示忽略文件中的首行,因为它包含列名而不是数据。

把Excel表格文件上传到mysql指定的文件夹/var/lib/mysql-files,不然会报错ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement,查看目录位置如下

mysql> show variables like '%secure%';
+--------------------------+-----------------------+
| Variable_name            | Value                 |
+--------------------------+-----------------------+
| require_secure_transport | OFF                   |
| secure_file_priv         | /var/lib/mysql-files/ |
+--------------------------+-----------------------+
2 rows in set (0.06 sec)

再次导入又报错了

mysql> LOAD DATA INFILE '/var/lib/mysql-files/IP.csv' INTO TABLE xuniji FIELDS TERMINATED BY ',' LINES TERRMINATED BY '\n' ;
ERROR 13 (HY000): Can't get stat of '/var/lib/mysql-files/IP.csv' (OS errno 13 - Permission denied)

更改下Excel表格的文件权限

mysql> LOAD DATA INFILE '/var/lib/mysql-files/IP.csv' INTO TABLE xuniji FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
ERROR 13 (HY000): Can't get stat of '/var/lib/mysql-files/IP.csv' (OS errno 13 - Permission denied)

又报错了,还是没权限

mysql> EXIT;
Bye

关闭selinux

setenforce 0

再次导入依然报错,不过不是权限问题了

mysql> LOAD DATA INFILE '/var/lib/mysql-files/IP.csv' INTO TABLE xuniji FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
ERROR 1366 (HY000): Incorrect string value: '\xD3\xC9\xC6\xF7\x0D' for column '用途' at row 10

好像是Excel表格第10行有问题,用vim编辑器打开发现中文全是乱码,因此将文件转换成utf-8

iconv -f GBK -t UTF-8 IP.csv > IP-utf8.csv

再次用vim编辑器打开发现文件没有乱码了

继续导入,终于成功了

mysql> LOAD DATA INFILE '/var/lib/mysql-files/IP-utf8.csv' INTO TABLE xuniji FIELDS TERMINATED BY ',' LINEES TERMINATED BY '\n' IGNORE 1 ROWS;
Query OK, 36 rows affected (0.01 sec)
Records: 36  Deleted: 0  Skipped: 0  Warnings: 0

4、验证

查询下第一列IP地址,检测下成果

mysql> SELECT ip地址 FROM xuniji;
+-----------------+
| ip地址          |
+-----------------+
| 10.10.10.1      |
| 10.10.10.2      |
| 10.10.10.3      |
| 10.10.10.4      |
| 10.10.10.5      |

后面还有很长,就不复制了,至此Excel表格导入MySQL数据库就圆满成功并结束了。可见虽然MySQL数据库和Excel表格有着天然的相似性,都是关系型表格呈现数据,但是想导入也绝非易事。

我这个测试表格没有任何公式和复杂的链接也只有3列,导入都花了这么多步骤,现实中的办公表格比这个复杂得多,困难也更加多。

1、新建TXT文本

首先在Windows电脑新建个test.txt文件,模拟学生信息表,编辑好了之后导入到MySQL数据库,txt文件的内容如下,上一个Excel表格是CSV格式,通过加逗号来来实现,其实导入数据库的文件也支持空格,只要能符合MySQL要求的格式就好了,在使用 LOAD DATA INFILE 命令时,列分隔符可以是任何字符,包括逗号、制表符、分号、空格等。它不必是英文的逗号。因此,如果您的文本文件中使用的是其他字符作为列分隔符,您可以在 LOAD DATA INFILE 命令中指定该字符作为分隔符。我的这个TXT文件是以一个空格作为分隔符。注意,我测试发现空格个数必须统一,比如一个空格那么整个TXT文本就都必须是一个空格,否则导入时就会报错导致导入失败。不得不说,MySQL对于数据文件的导入要求是非常严格的,不论是文件权限还是数据格式。既要保证安全性也要保证高效利用CPU、内存资源、尽可能少占用磁盘空间,所以创建表的时候甚至对于数据的长度都有规定。就像C语言,语法工整,定义要求严格,对于开发人员来说不友好,但是对于计算机来说正好相反,执行效率高可以以极低的硬件资源消耗来实现最佳的效果。所以单片机,硬件资源以MB甚至KB来记,却也能编程跑程序,那些高级语言比如Python对编程的人来说更加友好但却会消耗更多的硬件资源。下面这个是我的TXT文件


姓名 性别 年龄 电话号码

张三 男 15 12345

李四 男 20 88465

阿花 女 18 465414

二狗 男 22 26465

小美 女 30 556461


2、新建student数据库及info表

新建一个数据库,名称为student

mysql> create database student;
Query OK, 1 row affected (0.01 sec)


查看数据库情况

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ip                 |
| mysql              |
| performance_schema |
| student            |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

切换到student数据库

mysql> use student;
Database changed


新建一个表,名称为info

mysql> CREATE TABLE info (
    -> `姓名` VARCHAR(255),
    -> `性别` VARCHAR(16),
    -> `年龄` INT,
    -> `电话号码` VARCHAR(16));
Query OK, 0 rows affected (0.01 sec)


3、导入test.txt文件

把电脑上的test.txt文件上传到RockyLinux9.2系统的/var/lib/mysql-files目录下,上面导入Excel表格的时候发现MySQL定义的只有这个目录下的文件才能导入数据库。

查看表

mysql> show tables;
+-------------------+
| Tables_in_student |
+-------------------+
| info              |
+-------------------+
1 row in set (0.00 sec)


描述表结构

mysql> describe info;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| 姓名         | varchar(255) | YES  |     | NULL    |       |
| 性别         | varchar(16)  | YES  |     | NULL    |       |
| 年龄         | int          | YES  |     | NULL    |       |
| 电话号码     | varchar(16)  | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
4 rows in set (0.01 sec)


导入TXT文件

mysql> LOAD DATA INFILE '/var/lib/mysql-files/test.txt' INTO TABLE info FIELDS TERMINATED BY ' ' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
Query OK, 5 rows affected (0.00 sec)
Records: 5  Deleted: 0  Skipped: 0  Warnings: 0

已成功导入,上面的/var/lib/mysql-files/test.txt要写文件的绝对路径,FIELDS TERMINATED BY ' '单引号里面有一个空格,用于区分单元列,LINES TERMINATED BY '\n'表示一个换行符,具体地说,这个选项告诉MySQL在读取文本文件时,将文件中的每一行作为一个记录插入到表中,直到遇到一个换行符(\n),IGNORE 1 ROWS表示忽略第一行,我的这个TXT文件中第一行是定义列的名称,也就是table info。

4、验证成果

mysql> select * from info;
+--------+--------+--------+--------------+
| 姓名   | 性别   | 年龄   | 电话号码     |
+--------+--------+--------+--------------+
       | | 男     |     15 | 12345
       | | 男     |     20 | 88465
      |  | 女     |     18 | 465414
       | | 男     |     22 | 26465
      |  | 女     |     30 | 556461
+--------+--------+--------+--------------+
5 rows in set (0.00 sec)

可以看到将TXT文本导入电脑的实验也已经成功,当然也可以指定逗号,分号等作为每列的分隔符,只需要在导入文件进MySQL表的的时候告诉MySQL分隔符是什么就好了。

最后编辑于:2023/07/10作者: admin

发表评论