2013-10-28 8 views
0

我試圖導入一些csv和製表符刪除txt飼料到我的數據庫使用PHP腳本。他們似乎都工作,除了這一個。PHP mySQL LOAD LOCAL INFILE正好導入一半?

我有一個基地PHP腳本,包括數據庫連接,禁用鍵,每個進口進料(通過包括語句)並重新啓用密鑰,然後輸出最終結果之前。

,是造成我的問題是飼料這一塊,或者我應該說的SQL語句。

$sql = " 

LOAD DATA LOCAL INFILE '../feeds/feed6.txt' 
INTO TABLE supplierimport 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '\"' 
LINES TERMINATED BY '\\r\n' 
IGNORE 1 LINES 
(@col1,@col2,@col3,@col4,@col5,@col6,@col7,@col8,@col9,@col10,@col11,@col12,@col13,@col14,@col15,@col16) 
SET 
DistributorID = 546, [email protected], [email protected], [email protected], `Condition`[email protected], [email protected], Cost= replace(@col4, ',', ''), [email protected], [email protected], [email protected], [email protected]"; 

database_queryModify($sql,$result); 

print "Imported..."; 

所以,就這一個兩個問題:

  1. 使用此語句正確的; Cost= replace(@col4, ',', ''),我使用這個說法的原因是因爲我導入從每家供應商的成本入列cost在我的數據庫,但這個特殊的供應商使用的千個分隔符,即​​顯示飼料中1,000.53中,因此不會導入到我的數據庫正確,所以我找到了替換功能,但想驗證即時通訊在這種情況下正確使用它?

  2. 正是在文件中一半的行被導入到我的數據庫。我發現了這個問題; mysql load data local infile syntax issues with set fields正如你所看到的我已經把\ r \ n,但它仍然不會導入所有。

任何人都可以幫忙。

感謝

編輯:在逗號deliminated文本文件作爲一個例子,是三排。這是從文件中粘貼的,因此我沒有在每行之間插入額外的行。此外,第3行,你會看到,價格是「1,117.00」說明如何使用千個分隔符的工作:

"Item No.","Description","Description 2","Customers Price","Home stock","Brand Name","Expected date for delivery","Item Group No.","Item Group Name","Item Product Link (Web)","Item Picture Link (Web)","EAN/UPC","Weight","UNSPSC code","Product type code","Warranty" 

"/5PL0006","Drum Unit","DK-23","126.00","32","Kyocera","03/11/2013","800002","Drums","http://uk.product.com/product.aspx?id=%2f5PL0006","http://s.pic.eu/products/2_PICTURE-TAKEN.JPG","5711045360824","0.30","44103109","","3M" 

"/DK24","DK-24 Drum Unit FS-3750","","1,117.00","8","Dell","07/11/2013","800002","Drums","http://uk.product.com/product.aspx?id=%2fDK24","http://s.pic.eu/products/2_PICTURE-TAKEN.JPG","5711045360718","0.20","44103109","","3M" 
+0

你是如何從數據庫中獲得轉儲文件的? –

+0

@NaveenKumar它們是我的供應商提供的價格,以csv和txt製表符分隔 – user2231688

+0

問題在於千位分隔符與字段分隔符相同。因此,你必須改變(預處理你的文件)其中任何一個**之前**你用'LOAD DATA ...'導入它'' – peterm

回答

1

假設你的表看起來像

CREATE TABLE supplierimport 
(
distributorid int, 
MPN varchar(32), 
description varchar(100), 
description2 varchar(100), 
customers_price decimal(19,2), 
home_stock int, 
brand_name varchar(100), 
delivery_date date, 
item_group_number varchar(32), 
item_group_name varchar(100), 
product_link varchar(255), 
picture_link varchar(255), 
barcode varchar(32), 
weight decimal(19,4), 
UNSPSC varchar(32), 
product_type_code varchar(32), 
warranty varchar(32) 
); 

這將允許你成功加載數據

LOAD DATA LOCAL INFILE '/path/to/feed6.txt' 
INTO TABLE supplierimport 
    FIELDS TERMINATED BY ',' ENCLOSED BY '"' 
    LINES TERMINATED BY '\n' -- or '\r\n' in your case 
IGNORE 1 LINES 
(MPN, @description, @description2, @customers_price, @home_stock, @brand_name, @delivery_date, 
@item_group_number, @item_group_name, @product_link, @picture_link, @barcode, @weight, @UNSPSC, @product_type_code, @warranty) 
SET distributorid = 546, 
    description  = NULLIF(@description, ''), 
    description2  = NULLIF(@description2, ''), 
    customers_price = REPLACE(NULLIF(@customers_price), ',', ''), 
    home_stock  = NULLIF(@home_stock, ''), 
    brand_name  = NULLIF(@brand_name, ''), 
    delivery_date  = STR_TO_DATE(NULLIF(@delivery_date, ''), '%d/%m/%Y'), 
    item_group_number = NULLIF(@item_group_number, ''), 
    item_group_name = NULLIF(@item_group_name, ''), 
    product_link  = NULLIF(@product_link, ''), 
    picture_link  = NULLIF(@picture_link, ''), 
    barcode   = NULLIF(@barcode, ''), 
    weight   = NULLIF(@weight, ''), 
    UNSPSC   = NULLIF(@UNSPSC, ''), 
    product_type_code = NULLIF(@product_type_code, ''), 
    warranty   = NULLIF(@warranty, ''); 

結果我的機器上

 
mysql> select * from supplierimport; 
+---------------+----------+-------------------------+--------------+-----------------+------------+------------+---------------+-------------------+-----------------+--------------------------------------------------+----------------------------------------------+---------------+--------+----------+-------------------+----------+ 
| distributorid | MPN  | description    | description2 | customers_price | home_stock | brand_name | delivery_date | item_group_number | item_group_name | product_link          | picture_link         | barcode  | weight | UNSPSC | product_type_code | warranty | 
+---------------+----------+-------------------------+--------------+-----------------+------------+------------+---------------+-------------------+-----------------+--------------------------------------------------+----------------------------------------------+---------------+--------+----------+-------------------+----------+ 
|   546 | /5PL0006 | Drum Unit    | DK-23  |   126.00 |   32 | Kyocera | 2013-11-03 | 800002   | Drums   | http://uk.product.com/product.aspx?id=%2f5PL0006 | http://s.pic.eu/products/2_PICTURE-TAKEN.JPG | 5711045360824 | 0.3000 | 44103109 | NULL    | 3M  | 
|   546 | /DK24 | DK-24 Drum Unit FS-3750 | NULL   |   1117.00 |   8 | Dell  | 2013-11-07 | 800002   | Drums   | http://uk.product.com/product.aspx?id=%2fDK24 | http://s.pic.eu/products/2_PICTURE-TAKEN.JPG | 5711045360718 | 0.2000 | 44103109 | NULL    | 3M  | 
+---------------+----------+-------------------------+--------------+-----------------+------------+------------+---------------+-------------------+-----------------+--------------------------------------------------+----------------------------------------------+---------------+--------+----------+-------------------+----------+ 
2 rows in set (0.01 sec) 
+0

非常感謝。兩件事,雖然這與千位分隔符解決了問題,但我必須將「,」'「添加到nullif(@customersprice)位。但是,使用n \或\ r \ n仍然只能導入一半。發生了什麼事是它會錯過交替行(2,4,6,8,10等),但它會將錯過的行的項目編號放在上一行的保證列內,如果這樣做合理的話。我終於嘗試使用\ r和它導入完全雙空值爲所有列的雙重,但至少我可以使用刪除從空類型statment,然後我有我的rec – user2231688