4

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

这是我在数据库中创建的表:

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,远足后的三明治,
1,1,45,在Yama吃晚餐,
1,2,40,在墨菲吃晚餐,
1,1,40.81,在山吃晚餐,
1,2,1294.76,飞往台湾,1/17/2011
1,2,118.78,君悦酒店@首尔,1/22/2011
1,1,268.12,首尔提款,2011 年 1 月 8 日

这是我无法工作的 LOAD DATA 命令:

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

此命令完成,将正确数量的行上传到表中,但每个字段都是 NULL。每当我尝试添加由 ',' 封闭的字段或由 '\r\n' 终止的行时,都会出现语法错误。

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

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

4

2 回答 2

9

首先我会FLOAT改成DECIMALforcost

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
于 2013-07-16T03:24:06.450 回答
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);

这将让您看到真正正在加载的内容。然后,您可以将此数据加载到最终表中,执行任何必要的数据转换。

于 2013-07-16T01:47:08.637 回答