2013-07-16 25 views
4

我使用LOAD DATA INFILE將.csv上載到表中。使用LOAD DATA INFILE將csv上傳到mysql表中

這是我在我的數據庫中創建的表:

CREATE TABLE expenses (entry_id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entry_id), 
ss_id INT, user_id INT, cost FLOAT, context VARCHAR(100), date_created DATE); 

這是一些我想上傳(某些行有數據,每一行的樣本數據,一些缺少日柱):

 
1,1,20,Sandwiches after hike, 
1,1,45,Dinner at Yama, 
1,2,40,Dinner at Murphys, 
1,1,40.81,Dinner at Yama, 
1,2,1294.76,Flight to Taiwan,1/17/2011 
1,2,118.78,Grand Hyatt @ Seoul,1/22/2011 
1,1,268.12,Seoul cash withdrawal,1/8/2011 

這裏是LOAD DATA命令我不能去上班:

LOAD DATA INFILE '/tmp/expense_upload.csv' 
INTO TABLE expenses (ss_id, user_id, cost, context, date) 
; 

該命令完成後,將正確數量的行上載到表中,但每個字段都爲NULL。任何時候我嘗試添加FIELDS ENCLOSED BY','或LINES TERMINATED BY'\ r \ n'我收到語法錯誤。

其他注意事項:csv是在MS Excel中創建的。

如果有人有提示或可以指向正確的方向我會非常感激!

回答

7

首先,我會改變FLOATDECIMALcost

CREATE TABLE expenses 
(
    entry_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    ss_id INT, 
    user_id INT, 
    cost DECIMAL(19,2), -- use DECIMAL instead of FLOAT 
    context VARCHAR(100), 
    date_created DATE 
); 

現在試試這個

LOAD DATA INFILE '/tmp/sampledata.csv' 
INTO TABLE expenses 
    FIELDS TERMINATED BY ',' 
      OPTIONALLY ENCLOSED BY '"' 
    LINES TERMINATED BY '\n' -- or \r\n 
(ss_id, user_id, cost, context, @date_created) 
SET date_created = IF(CHAR_LENGTH(TRIM(@date_created)) > 0, 
         STR_TO_DATE(TRIM(@date_created), '%m/%d/%Y'), 
         NULL); 

什麼ID的作用:

  1. 它使用正確的語法指定領域和列終結者
  2. 由於文件中的日期值格式不正確,它首先爲用戶/會話變量讀取一個值,如果該值不爲空,則將其轉換爲日期,否則分配NULL。後者可以防止你獲得零日期0000-00-00
+0

總是使用'DECIMAL'作爲貨幣價值。總是。 – Mindwin

0

這是我的建議。將數據加載到所有列都是字符串的登臺表中,然後插入到最終表中。這可以讓你更好地檢查結果:

CREATE TABLE expenses_staging (entry_id INT NOT NULL AUTO_INCREMENT, 
           PRIMARY KEY(entry_id), 
           ss_id varchar(255), 
           user_id varchar(255), 
           cost varchar(255), 
           context VARCHAR(100), 
           date_created varchar(255) 
          ); 

LOAD DATA INFILE '/tmp/expense_upload.csv' 
    INTO TABLE expenses_staging (ss_id, user_id, cost, context, date); 

這將讓你看到什麼是真的被加載。然後,您可以將這些數據加載到最終表格中,進行任何必要的數據轉換。

+0

看到這一切很有幫助,不幸的是每50行中有1個被導入,其餘的都是NULL。任何想法,爲什麼會這樣? –