2015-07-03 6 views
0

У меня есть Windows пакетный файл, который читает все CSV-файлы в его каталоге. Проблема заключается в том, что строки CSV имеют двойные кавычки в метке времени, а также включают микроданные. Я уверен, что нижеприведенный код должен быть закрыт, но он либо импортирует одну строку, либо выдает NULL в столбце timestamp, или указывает, что «SET был неожиданным в это время», что, я думаю, связано с неэкранированным символом потому что это выполняется как Windows командный файл Мой код ниже и ниже, это образец данных файла CSV.LOAD DATA INFILE с кавычками вокруг метки времени, которая содержит микросекунды

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 

ответ

0
@ECHO OFF >NUL 
SETLOCAL enableextensions enabledelayedexpansion 

pushd "D:\bat\SO\files" 
FOR %%f IN ("*.csv") DO (
    if /I "%%~nxf"=="31212125.csv" (
    set "old=%%~dpnxf" 
    set "new=!old:\=\\!" 
    echo old="!old!" new="!new!" 
    echo(
    FOR /F "usebackq tokens=1,2* delims=," %%G IN ("!old!") DO (
     rem 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 G=%%~G [H]=[%%~H] I=%%~I 
    ) 
) else rem echo skipped %%~nxf 
) 
popd 

Данный скрипт показывает путь, как может быть разобраны входные строки файла. Операционная команда mysql закомментирована без изменений as imho вопрос около .bat сценариев, а не mysql. Обратите внимание, что if /I "%%~nxf"=="31212125.csv" здесь просто пропустить мои другие тестовые CSV.

Выход:

==>type D:\bat\SO\files\31212125.csv 
12499,"2014-01-28 11:00:00.0",0,0,0,0,0,5,0,0 
12500,"2014-01-28 12:00:00.0",0,4,0,0,1,0,0,2 
12501,"2014-01-28 13:00:00.0",0,1,0,0,4,0,0,4 
12502,"2014-01-28 14:00:00.0",0,0,0,0,0,0,0,7 
12503,"2014-01-28 15:00:00.0",0,0,0,0,3,0,0,2 

==>D:\bat\SO\31212125.bat 
old="D:\bat\SO\files\31212125.csv" new="D:\\bat\\SO\\files\\31212125.csv" 

G=12499 [H]=[2014-01-28 11:00:00.0] I=0,0,0,0,0,5,0,0 
G=12500 [H]=[2014-01-28 12:00:00.0] I=0,4,0,0,1,0,0,2 
G=12501 [H]=[2014-01-28 13:00:00.0] I=0,1,0,0,4,0,0,4 
G=12502 [H]=[2014-01-28 14:00:00.0] I=0,0,0,0,0,0,0,7 
G=12503 [H]=[2014-01-28 15:00:00.0] I=0,0,0,0,3,0,0,2 

==> 
+0

Я monkeyed с этим сценарием вы положили вместе на выходные и немного более сегодня, и я могу что он выводится, как вы говорите, но ничего не импортирует в базу данных. Я буду честен, хотя, я понятия не имею, что происходит с изменениями, которые вы сделали. Я буду держать Googling и, надеюсь, это будет иметь больше смысла, но я ценю вашу работу. Казалось бы, мне нужно много узнать о сценариях .bat. – JubJub24

1

Проблема здесь заключается в том, что процесс импорта 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 
) 
+0

В дополнение к моему предыдущему, я думаю, что ответ заключается в использовании %%^в операторе SQL, таким образом: ... SET timeStamp = STR_TO_DATE (@timeStamp, '%%^Y - %%^m - %%^d %%^H: %%^i: %%^s. %%^f ') ... – user8417427

+0

Сделали - спасибо! – user8417427