使用LOAD DATA INFILE将csv上传到mysql表中

joh*_*n k 4 mysql load-data-infile

我正在使用LOAD DATA INFILE将.csv上传到表中.

这是我在db中创建的表:

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);
Run Code Online (Sandbox Code Playgroud)

这是我尝试上传的一些示例数据(某些行包含每列的数据,有些行缺少日期列):

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)
;
Run Code Online (Sandbox Code Playgroud)

此命令完成,将正确的行数上传到表中,但每个字段都为NULL.任何时候我尝试添加FIELDS ENCLOSED BY','或LINES TERMINATED BY'\ r \n'我得到语法错误.

其他注意事项:csv是在MS Excel中创建的.

如果有人有提示或可以指出我正确的方向,将不胜感激!

pet*_*erm 7

首先,我会改变FLOAT,以DECIMALcost

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
);
Run Code Online (Sandbox Code Playgroud)

现在尝试一下

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);
Run Code Online (Sandbox Code Playgroud)

id的作用是什么:

  1. 它使用正确的语法来指定字段和列终止符
  2. 由于文件中的日期值格式不正确,因此它首先读取用户/会话变量的值,如果它不为空,则将其转换为日期,否则分配NULL.后者阻止您获得零日期0000-00-00.