若是文本文件中有数据,则能够轻松地将它们上载到数据库中的一个或多个表。
在MySQL数据库(或MariaDB)中,使用“ load data infile”命令,您能够将数据从文本文件上传到表。
load data infile命令提供了几个灵活的选项,能够将各类格式的数据从文本文件加载到表中。mysql
`#cat employee1.txt
100 Thomas Sales 5000
200 Jason Technology 5500
300 Mayla Technology 7000
400 Nisha Marketing 9500
500 Randy Technology 6000`linux
默认状况下,load data infile命令使用TAB做为默认字段定界符。sql
首先,转到您要上载文本文件的数据库。在此示例中,咱们将上面的employee1.txt文件上传到位于geekstuff mysql数据库下的employee表中。shell
`USE rumenzdata;
LOAD DATA INFILE 'employee1.txt'
INTO TABLE employee;`数据库
注意:在上面的示例中,该命令假定employee1.txt文件位于数据库目录下。例如,若是要在rumenzdata数据库中执行上述命令,则将文件放在如下位置:/ var/lib/mysql/rumenzdata/ 命令行
Query OK, 5 rows affected (0.00 sec)
Records: 5Deleted: 0Skipped: 0Warnings: 0code
第一行“查询肯定”表示查询已执行,没有任何错误。它还说总共有5行上载到该表。这还会显示将数据从文本文件上传到表所花费的时间(以秒为单位)。
第二行显示上传的总行数,跳过的行数以及在上传过程当中显示警告的记录数。ip
`select * from employee;
id | name | dept | salary |
---|---|---|---|
100 | Thomas | Sales | 5000 |
200 | Jason | Technology | 5500 |
300 | Mayla | Technology | 7000 |
400 | Nisha | Marketing | 9500 |
500 | Randy | Technology | 6000 |
+-----+--------+------------+--------+`文件上传
注意:若是要备份和还原整个MySQL数据库,请使用mysqldump命令。it
在下面的示例中,在输入文件employee2.txt中,字段值用逗号分隔。
`#cat employee2.txt
100,Thomas,Sales,5000
200,Jason,Technology,5500
300,Mayla,Technology,7000
400,Nisha,Marketing,9500
500,Randy,Technology,6000`
要将以上记录上传到员工表,请使用如下命令。
在上传过程当中,使用“ FIELDS TERMINATED BY”选项,您能够指定逗号字段分隔符,以下所示。
`USE rumenzdata;
LOAD DATA INFILE 'employee2.txt'
INTO TABLE employee
FIELDS TERMINATED BY ',';`
若是字段以冒号分隔,则在上面的命令中使用如下选项:
`FIELDS TERMINATED BY ':';`
在如下示例中,输入文本文件具备用双引号引发来的文本字段值。即,名称和部门值在其周围带有双引号。
`#cat employee3.txt
100,"Thomas Smith","Sales & Marketing",5000
200,"Jason Bourne","Technology",5500
300,"Mayla Jones","Technology",7000
400,"Nisha Patel","Sales & Marketing",9500
500,"Randy Lee","Technology",6000`
在这种状况下,请使用“ENCLOSED BY”选项,以下所示。
`LOAD DATA INFILE 'employee3.txt'
INTO TABLE employee
FIELDS TERMINATED BY ',' ENCLOSED BY '"';`
`select * from employee;
id | name | dept | salary |
---|---|---|---|
100 | Thomas Smith | Sales & Marketing | 5000 |
200 | Jason Bourne | Technology | 5500 |
300 | Mayla Jones | Technology | 7000 |
400 | Nisha Patel | Sales & Marketing | 9500 |
500 | Randy Lee | Technology | 6000 |
+-----+--------------+-------------------+--------+`
假设您在特定字段的值中有逗号。例如,在下面的示例中,第二个字段名称具备如下格式的值:“名字,姓氏”。
`#cat employee4.txt
100,Thomas, Smith,Sales,5000
200,Jason, Bourne,Technology,5500
300,Mayla, Jones,Technology,7000
400,Nisha, Patel,Marketing,9500
500,Randy, Lee,Technology,6000`
若是使用如下命令加载以上文件,则会看到该文件显示“ 10条警告”
`LOAD DATA INFILE 'employee4.txt'
->INTO TABLE employee
->FIELDS TERMINATED BY ',';
Query OK, 5 rows affected, 10 warnings (0.00 sec)
Records: 5Deleted: 0Skipped: 0Warnings: 10`
因为字段之一的值中有逗号,所以记录也没有正确加载。
`select * from employee; <pre>
id | name | dept | salary |
---|---|---|---|
100 | Thomas | Smith | 0 |
200 | Jason | Bourne | 0 |
300 | Mayla | Jones | 0 |
400 | Nisha | Patel | 0 |
500 | Randy | Lee | 0 |
+-----+--------+---------+--------+`
</pre>
正确的文件:要解决上述问题,请在名称字段值的逗号前面使用反斜杠(\),以下所示。
`#cat employee4.txt
100,Thomas, Smith,Sales,5000
200,Jason, Bourne,Technology,5500
300,Mayla, Jones,Technology,7000
400,Nisha, Patel,Marketing,9500
500,Randy, Lee,Technology,6000`
此次将正常工做,由于咱们使用\做为转义字符。
`LOAD DATA INFILE 'employee4.txt'
->INTO TABLE employee
->FIELDS TERMINATED BY ',';
select * from employee; | |||
---|---|---|---|
id | name | dept | salary |
100 | Thomas, Smith | Sales | 5000 |
200 | Jason, Bourne | Technology | 5500 |
300 | Mayla, Jones | Technology | 7000 |
400 | Nisha, Patel | Marketing | 9500 |
500 | Randy, Lee | Technology | 6000 |
+-----+---------------+------------+--------+`
您还可使用其余转义字符,以下所示。在此示例中,咱们使用^做为转义字符,而不是defualt \。
`#cat employee41.txt
100,Thomas^, Smith,Sales,5000
200,Jason^, Bourne,Technology,5500
300,Mayla^, Jones,Technology,7000
400,Nisha^, Patel,Marketing,9500
500,Randy^, Lee,Technology,6000`
在这种状况下,请使用“ ESCAPED BY”选项,以下所示。
`LOAD DATA INFILE 'employee41.txt'
INTO TABLE employee
FIELDS TERMINATED BY ',' ESCAPED BY '^'`
请注意,某些字符不能用做转义字符。例如,若是您将%用做转义字符,则会收到如下错误消息。
`LOAD DATA INFILE 'employee41.txt'
INTO TABLE employee
FIELDS TERMINATED BY ',' ESCAPED BY '%'
ERROR 1083 (42000): Field separator argument is not what is expected; check the manual`
除了将全部记录放在单独的行上以外,您还能够将它们放在同一行上。在下面的示例中,每一个记录都由|分隔。符号。
`#cat employee5.txt
100,Thomas,Sales,5000|200,Jason,Technology,5500|300,Mayla,Technology,7000|400,Nisha,Marketing,9500|500,Randy,Technology,6000`
要上传上述文件,请使用以“选项”终止的行,以下所示。
`LOAD DATA INFILE 'employee5.txt'
INTO TABLE employee
FIELDS TERMINATED BY ','
LINES TERMINATED BY '|';`
上面的命令将从employee5.txt上传记录,以下所示。
`select * from employee;
id | name | dept | salary |
---|---|---|---|
100 | Thomas | Sales | 5000 |
200 | Jason | Technology | 5500 |
300 | Mayla | Technology | 7000 |
400 | Nisha | Marketing | 9500 |
500 | Randy | Technology | 6000 |
+-----+--------+------------+--------+`
若是输入文件来自Windows计算机,则可能要使用此命令:'\ r \ n'终止的行
若是您使用CSV文件将数据上传到表格,请尝试如下方法之一:1)以'\ r'终止的行2)以'\ r \ n'终止的行
您还能够在输入文本文件中为记录添加一些前缀,在上传过程当中能够忽略这些前缀。
例如,在下面的employee6.txt文件中,对于第一条记录,第二条记录和第五条记录,咱们在行的开头有“数据:”。您能够经过忽略行前缀来仅上传这些记录。
`#cat employee6.txt
Data:100,Thomas,Sales,5000
Data:200,Jason,Technology,5500
300,Mayla,Technology,7000
400,Nisha,Marketing,9500
Data:500,Randy,Technology,6000`
要忽略行前缀并上载这些记录(例如,上述文件中的“ Data:”),请使用“ lines starts by”选项,以下所示。
`LOAD DATA INFILE 'employee6.txt'
INTO TABLE employee
FIELDS TERMINATED BY ','
LINES STARTING BY 'Data:';
Query OK, 3 rows affected (0.00 sec)
Records: 3Deleted: 0Skipped: 0Warnings: 0`
以下所示,上述命令仅上载了以“ Data:”为前缀的记录。这有助于选择性地仅上传具备特定前缀的记录。
`select * from employee;
id | name | dept | salary |
---|---|---|---|
100 | Thomas | Sales | 5000 |
200 | Jason | Technology | 5500 |
500 | Randy | Technology | 6000 |
3 rows in set (0.00 sec)`
在如下输入文本文件中,第一行是标题行,其标题为列。
`#cat employee7.txt
empid,name,department,salary
100,Thomas,Sales,5000
200,Jason,Technology,5500
300,Mayla,Technology,7000
400,Nisha,Marketing,9500
500,Randy,Technology,6000`
在上载期间,咱们要忽略employee7.txt文件中的第一个标头留置权。为此,请使用IGNORE 1 lines选项,以下所示。
`LOAD DATA INFILE 'employee7.txt'
INTO TABLE employee
FIELDS TERMINATED BY ','
IGNORE 1 LINES;`
从下面的输出中能够看到,即便输入文件有6行,它也忽略了第一行(即标题行),并上传了其他5行。
`select * from employee;
id | name | dept | salary |
---|---|---|---|
100 | Thomas | Sales | 5000 |
200 | Jason | Technology | 5500 |
300 | Mayla | Technology | 7000 |
400 | Nisha | Marketing | 9500 |
500 | Randy | Technology | 6000 |
+-----+--------+------------+--------+`
在下面的示例中,咱们仅具备三个字段的值。在此示例文件中,咱们没有部门列。
`#cat employee8.txt
100,Thomas,5000
200,Jason,5500
300,Mayla,7000
400,Nisha,9500
500,Randy,6000`
要将值从输入记录上传到表中的特定列,请在装入数据文件中指定列名,以下所示。如下命令的最后一行具备应用于从输入文本文件上载记录的列名称。
`LOAD DATA INFILE 'employee8.txt'
INTO TABLE employee
FIELDS TERMINATED BY ','
(id, name, salary);`
因为咱们没有在上面的命令中指定“ dept”列,所以咱们将看到该列为NULL,以下所示。
`select * from employee;
id | name | dept | salary |
---|---|---|---|
100 | Thomas | NULL | 5000 |
200 | Jason | NULL | 5500 |
300 | Mayla | NULL | 7000 |
400 | Nisha | NULL | 9500 |
500 | Randy | NULL | 6000 |
+-----+--------+------+--------+`
对于此示例,让咱们使用如下employee2.txt文件。
`#cat employee2.txt
100,Thomas,Sales,5000
200,Jason,Technology,5500
300,Mayla,Technology,7000
400,Nisha,Marketing,9500
500,Randy,Technology,6000`
在此示例中,咱们但愿在将薪金上载以前将其增长500。例如,Thomas的薪水(第一条记录)为5000。可是,在上载期间,咱们但愿将其增长500至5500,并更新表中的此增长值。为此,请使用SET命令并将薪水用做变量,并以下所示进行增量。
`LOAD DATA INFILE 'employee2.txt'
INTO TABLE employee
FIELDS TERMINATED BY ','
(id, name, dept, @salary)
SET salary = @salary+500;`
从如下输出中能够看到,在从文本文件上载数据期间,全部记录的salary列增长了500。
`select * from employee;
id | name | dept | salary |
---|---|---|---|
100 | Thomas | Sales | 5500 |
200 | Jason | Technology | 6000 |
300 | Mayla | Technology | 7500 |
400 | Nisha | Marketing | 10000 |
500 | Randy | Technology | 6500 |
+-----+--------+------------+--------+`
有时,您可能但愿自动从文本文件上传数据,而没必要每次都登陆到mysql提示符。
假设咱们想将如下命令放入一个shell脚本中,而后在geekstuff数据库上自动执行该命令。
`LOAD DATA INFILE 'employee2.txt'
INTO TABLE employee
FIELDS TERMINATED BY ','`
要从命令行执行加载,您将在mysql命令中使用-e选项,并从linux提示符下执行它,以下所示。
`#mysql -e "LOAD DATA INFILE 'employee2.txt' INTO TABLE employee FIELDS TERMINATED BY ','" \
-u root -pMySQLPassword rumenzdata`
或者,您能够将其放入外壳脚本中,以下所示。在此示例中,load-data.sh Shell脚本具备上述mysql命令。
`#cat load-data.sh
mysql -e "\
LOAD DATA INFILE 'employee2.txt'\
INTO TABLE employee \
FIELDS TERMINATED BY ','\ " \
-u root -pMySQLPwd4MDN! test`
授予该load-data.sh脚本执行权限,而后从命令行执行它,这会将数据自动加载到表中。您还能够将其做为cronjob进行调度,以按调度的时间间隔自动将文件中的数据加载到表中。
`#chmod u+x load-data.sh