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`

相關文章
相關標籤/搜索