若是文本文件中有數據,則能夠輕鬆地將它們上載到數據庫中的一個或多個表。
在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