我有一个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/