mysql - LOAD DATA INFILE,在包含微秒的时间戳周围加上引号

标签 mysql csv batch-file load-data-infile

我有一个Windows 批处理文件,可以读取其目录中的所有 CSV 文件。我遇到的问题是 CSV 的行在时间戳中包含双引号,并且还包含微发送。我很确定下面的代码必须很接近,但它要么导入一行并在时间戳列中转储 NULL,要么表明“SET 此时是意外的”,我认为这是由于未转义的字符造成的因为这是作为 Windows 批处理文件运行的,我的代码如下,下面是 CSV 文件数据的示例。

echo on
setlocal enabledelayedexpansion
FOR %%f IN ("*.csv") DO (
set old=%%~dpnxf
set new=!old:\=\\!
mysql -e "LOAD DATA local INFILE '"!new!"' IGNORE into table db.table  COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY  '\"'  (prodID,@timeStamp,Ch1,Ch2,Ch3,Ch4,Ch5,Ch6,Ch7,Ch8) SET timeStamp=STR_TO_DATE(@timeStamp,'%%Y-%%m-%%d %%H:%%i:%%s.%%f')" -u user -ppass
  echo %%~nxf DONE
)


12499,"2014-01-28 11:00:00.0",0,0,0,0,0,5,0,0
12499,"2014-01-28 12:00:00.0",0,4,0,0,1,0,0,2
12499,"2014-01-28 13:00:00.0",0,1,0,0,4,0,0,4
12499,"2014-01-28 14:00:00.0",0,0,0,0,0,0,0,7
12499,"2014-01-28 15:00:00.0",0,0,0,0,3,0,0,2

最佳答案

这里的问题是 MySQL 导入过程要求在日期/时间格式中使用“%”字符。不幸的是,该字符也被 Windows 批处理程序占用。 真正的问题是“如何转义 SQL 语句中的百分比字符,以便它们被批处理文件中的 for 循环忽略,即不变地发送到 MySQL?” 似乎对我有用的答案是在 SQL 语句中使用 %%^,因此:

echo on
setlocal enabledelayedexpansion
FOR %%f IN ("*.csv") DO (
set old=%%~dpnxf
set new=!old:\=\\!
mysql -e "LOAD DATA local INFILE '"!new!"' IGNORE into table db.table  COLUMNS TERMINATED BY ',' OPTIONALLY ENCLOSED BY  '\"'  (prodID,@timeStamp,Ch1,Ch2,Ch3,Ch4,Ch5,Ch6,Ch7,Ch8) SET timeStamp=STR_TO_DATE(@timeStamp,'%%^Y-%%^m-%%^d %%^H:%%^i:%%^s.%%^f')" -u user -ppass
  echo %%~nxf DONE
)

关于mysql - LOAD DATA INFILE,在包含微秒的时间戳周围加上引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31212125/

相关文章:

mysql - SQL 用 MATCH() AGAINST() 替换函数

php - Bootstrap HTML + MySQL PHP 表单安全

r - 如何从 R 中的数据框中去除美元符号 ($)?

batch-file - netstat bat 脚本记录所有 RDP 连接

scripting - IF ELSE 问题 COMMAND BATCH

php - MySQL 如果值为空则不搜索

mysql - 表 1 与表 2 外键引用的子项总和之间的 SQL 查询差异

php - 在使用 PHP 上传之前将 (xls, xlsx) 转换为 CSV

python - 如何在单独的行和列上正确编写 CSV 文件?

oracle - 请帮助 SQLPLUS?如何使 SQLPLUS 最初使用 DEFINE `OFF` 启动?