1

我正在尝试使用 mysql 的LOAD DATA LOCAL INFILE语法将.csv文件加载到现有表中。这是我.csv文件中的一条记录(带有标题):

 PROD,       PLANT,PORD,  REVN,A_CPN,     A_CREV,BRDI,       DTE,     LTME
 100100128144,12T1,2070000,04,3DB18194ACAA,05_01,ALA13320004,20130807,171442

问题是我想在导入期间完成 3 件额外的事情:

  1. A RECORDIDINT NOT NULL AUTO_INTEGER PRIMARY_KEY 字段应随着每一行的插入而递增(此表列和结构已存在于 mysql 表中)

  2. DTE 和 LTME 应连接起来并转换为 mysqlDATETIME格式并插入到名为TRANS_OCR

  3. CREATEDTIMESTAMP 字段应设置为行插入时的当前 unix 时间戳(此表列和结构也已存在于 mysql 表中)

我正在尝试使用以下命令将此数据导入 mysql 表:

 LOAD DATA LOCAL INFILE 'myfile.csv' INTO TABLE seriallog
 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
 LINES TERMINATED BY '\n'
 IGNORE 1 LINES
 (FLEX_PN, FLEX_PLANT, FLEX_ORDID, FLEX_REV, CUST_PN, CUST_REV, SERIALID)
 SET CREATED = CURRENT_TIMESTAMP;

我认为我的CREATED列设置正确,但其他列导致发出 mysql 警告:

Warning: Out of range value for column 'FLEX_PN' at row 1
Warning: Row 1 was truncated; it contained more data than there were input columns

有人可以帮我语法吗,这个LOAD DATA LOCAL INFILE模块让我很困惑......

4

1 回答 1

0

找出正确的语法来完成这项工作:

sql = """LOAD DATA LOCAL INFILE %s INTO TABLE seriallog_dev 
         FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' 
         LINES TERMINATED BY '\\n' 
         IGNORE 1 LINES 
         (FLEX_PN, FLEX_PLANT, FLEX_ORDID, FLEX_REV, CUST_PN, CUST_REV, SERIALID, @DTE, @LTME) 
         SET RECORDID = NULL, 
             TRANS_OCR = STR_TO_DATE(CONCAT(@DTE,'',@LTME), "%%Y%%m%%d%%H%%i%%s"), 
             CREATED = CURRENT_TIMESTAMP;"""

params = (file,)
self.db.query( sql, params )

请注意——这是通过 python 的 mysqldb 模块完成的。

警告

此解决方案的唯一问题是,由于某种原因,我的批量插入仅插入了文件中的前 217 行数据。我的总文件大小是 19KB,所以我无法想象它对于 mysql 缓冲区来说太大了......那是什么?

更多信息

另外,我只是在 msyql-server CLI 中直接尝试了这种语法,它适用于所有 255 条记录。所以,很明显,python、python mysqldb 模块或 mysqldb 模块建立的 mysql 连接有问题......

完毕

我刚刚发现了问题,它与加载数据本地 infile 命令无关,而是我在尝试导入 .csv 之前将原始 .dbf 文件转换为 .csv 的方法。由于某种原因,mysql 导入方法在 .dbf 到 .csv 转换方法完成之前在 .csv 上运行 - 导致在 .csv 文件中找到部分数据集并导入......抱歉浪费大家的时间!

于 2013-09-04T02:24:19.933 回答