我正在使用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);
这是我尝试上传的一些示例数据(某些行包含每列的数据,有些行缺少日期列):
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中创建的。
如果有人有提示或能指出我正确的方向,那将非常感激!
答案 0 :(得分:7)
首先,我要FLOAT
将DECIMAL
更改为cost
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做什么:
NULL
。后者阻止您获得零日期0000-00-00
。答案 1 :(得分: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);
这将让你看到真正加载的是什么。然后,您可以将此数据加载到最终表中,执行任何必要的数据转换。