10个MySQL加载数据内文件示例以将文本文件数据上传到表

10个MySQL加载数据内文件示例以将文本文件数据上传到表

若是文本文件中有数据,则能够轻松地将它们上载到数据库中的一个或多个表。
在MySQL数据库(或MariaDB)中,使用“ load data infile”命令,您能够将数据从文本文件上传到表。
load data infile命令提供了几个灵活的选项,能够将各类格式的数据从文本文件加载到表中。mysql

  1. 文本文件加载数据的基本示例
  2. 使用“字段终止于”选项上传数据
  3. 使用“附件”选项上传数据
  4. 在文本文件数据中使用转义符
  5. 使用“行终止于”选项上传数据
  6. 使用“开始方式”选项忽略上传文件中的行前缀
  7. 从上传文件中忽略标题行
  8. 从上传文件仅上传特定列(并忽略其余列)
  9. 经过“设置”选项在上传过程当中使用变量
  10. 编写Shell脚本以从文本文件加载数据

1.从文本文件加载数据的基本示例

`#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

2.使用“字段终止于”选项上传数据

在下面的示例中,在输入文件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 ':';`

3.使用“附件”选项上传数据

在如下示例中,输入文本文件具备用双引号引发来的文本字段值。即,名称和部门值在其周围带有双引号。

`#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

+-----+--------------+-------------------+--------+`

4.在文本文件数据中使用转义符

假设您在特定字段的值中有逗号。例如,在下面的示例中,第二个字段名称具备如下格式的值:“名字,姓氏”。

`#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`

5.使用“行终止于”选项上传数据

除了将全部记录放在单独的行上以外,您还能够将它们放在同一行上。在下面的示例中,每一个记录都由|分隔。符号。

`#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'终止的行

6.使用“ Starting By”选项忽略上传文件中的行前缀

您还能够在输入文本文件中为记录添加一些前缀,在上传过程当中能够忽略这些前缀。
例如,在下面的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)`

7.从上传文件中忽略标题行

在如下输入文本文件中,第一行是标题行,其标题为列。

`#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

+-----+--------+------------+--------+`

8.仅从上传文件上传特定列(并忽略其余列)

在下面的示例中,咱们仅具备三个字段的值。在此示例文件中,咱们没有部门列。

`#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

+-----+--------+------+--------+`

9.在上传过程当中使用带有“设置”选项的变量

对于此示例,让咱们使用如下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

+-----+--------+------------+--------+`

10.编写Shell脚本以从文本文件加载数据

有时,您可能但愿自动从文本文件上传数据,而没必要每次都登陆到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

./load-data.sh`

相关文章
相关标签/搜索