2011-05-01 95 views
1

我正在嘗試編寫一個bash腳本,該腳本將給定本地MySQL數據庫的名稱,將其所有表中的數據導出爲帶有標題的CSV文件包含字段名稱的行。例如,如果數據庫有表customers,ordersinventory,我想轉儲三個文件customers.csv,orders.csvinventory.csv,包括每個文件的標題中的字段名稱。解析mysqldump的輸出以創建帶有字段名稱頭的CSV文件

修補mysqldump,我已經設法產生我需要的所有.csv文件,但沒有字段名稱標題行。該命令還會在SQL命令中創建一組僅包含表結構的.sql文件。經過大量搜索之後,我找不到任何能夠解決這個問題的人,而無需「重新發明輪子」並編寫他們自己的MySQL轉儲腳本。 mysqldump很棒,它只是缺少這個小功能。我需要的所有字段名稱都在那些SQL文件中,它只是解析它們併爲每個CSV文件添加一行字段名稱的問題,對不對?

我的問題:我是一個shell腳本新手,我不知道如何去做這件事。

這裏是我目前使用mysqldump命令:

mysqldump --host=localhost --user=myusername --password=mypassword \ 
      --tab=/tmp/db/ --verbose mydatabase \ 
      --fields-enclosed-by=\" --fields-terminated-by=, 

假設數據庫MyDatabase的有表customersordersinventory。該命令將在目錄/ tmp/db中生成六個文件:customers.sql,customers.txt,orders.sql,orders.txt,inventory.sql,inventory.txt。 (在txt文件是CSV文件,我的劇本後文件擴展名更改爲.csv)

的.sql文件看起來像這樣(使用客戶爲例):

-- MySQL dump 10.13 Distrib 5.1.54, for debian-linux-gnu (i686) 
-- 
-- Host: localhost Database: mydatabase 
-- ------------------------------------------------------ 
-- Server version  5.1.54-1ubuntu4 

/* (i removed some generated comments here) */; 

-- 
-- Table structure for table `customers` 
-- 

DROP TABLE IF EXISTS `customers`; 
/* (i removed some generated comments here) */; 
CREATE TABLE `customers` (
    `customer_id` int(11) NOT NULL AUTO_INCREMENT, 
    `first_name` varchar(256) NOT NULL, 
    `last_name` varchar(256) NOT NULL, 
    `email` varchar(256) NOT NULL, 
    `phone` varchar(20) NOT NULL, 
    `notes` longtext NOT NULL, 
    PRIMARY KEY (`customer_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=1865 DEFAULT CHARSET=latin1; 

/* (i removed some generated comments here) */; 
-- Dump completed on 2011-05-01 13:03:02 

和.txt文件看起來像你期望的CSV看起來(「數據」,「像」,「這個」)的行,但沒有字段名稱標題。

正如你所看到的,我需要的字段名在「CREATE TABLE ...」之後的.sql文件中。

理想的劇本我想寫將做到以下幾點:

  1. 運行mysqldump命令我上面詳述。
  2. 遍歷所有匹配的文件/tmp/db/*.sql,併爲每個:
    1. 解析出字段名,並生成一個「串」,「的」,「他們」,「喜歡」 ,「this」
    2. 在匹配的.txt文件中,在第一行之前插入字段名稱的字符串。
  3. 將所有.txt文件重命名爲.csv並刪除所有.sql文件。

任何提示?我一整天都在修補這件事,直到我弄明白爲止。

回答

2

我在windows下做了一個簡單的測試。

create database if not exists test; 

use test; 

create table csv_header(
id int not null auto_increment primary key, 
fname varchar(50), 
lname varchar(50), 
dob date) 
engine = myisam; 

insert into csv_header (fname,lname,dob) values 
('nick','smith','2000-12-05'), 
('john','white','1990-12-05'); 

set @str = (select concat("select * from (select ", group_concat(concat("'",column_name,"'"))," union 
      select * from ", table_name, ") as t into outfile 'd:/",table_name,".txt' 
     fields terminated by ',' 
     lines terminated by '\r\n'") 
      from information_schema.columns 
      where table_schema = 'test' and table_name = 'csv_header' 
      order by ordinal_position); 

-- select @str; 

prepare stmt from @str; 
execute stmt; 
deallocate prepare stmt; 

這是我csv_header.txt的內容:

id,fname,lname,dob 
1,nick,smith,2000-12-05 
2,john,white,1990-12-05 

如果這是你在找什麼,它是簡單的創建與循環中的所有表遊標的存儲過程在模式中,併爲每一個做同樣的事情。讓我知道。 :)

0

我無法找到一個方法來做到這一點,因爲:

  • 我的數據庫服務器是
  • 遠程計算機沒有NFS
  • 也不寫入共享的能力在我的本地。

我做了一個標準的SQL轉儲,並將該文件格式化爲CSV格式。

0
set group_concat_max_len = 5000; 

set @qry = (select concat("select ",group_concat(CONCAT('''', column_name, '''')), " UNION SELECT * FROM " ,table_name, ' INTO OUTFILE ', " '/tmp/test.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n' ") from information_schema.columns where table_schema = database() and table_name = 'spree_users'); 

prepare stmt from @qry; 
execute stmt; 
deallocate prepare stmt; 
相關問題