[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理怎样把字符串分割并重组?

本帖最后由 slovent 于 2015-1-15 09:28 编辑

想咨询如何将mysql里的insert语句重组为delete语句。

原始脚本如下,脚本存放在insert.sql文本中
INSERT INTO `table1` (`field1`, `field2`, `field3`, `field4`) VALUES ('value1', 'value2', 'value3', 'value4');
INSERT INTO `table2` (`field1`, `field2`, `field3`, `field4`, `field5`, `field6`) VALUES ('value1', 'value2', 'value3', 'value4', NULL, 'value6');
......

希望通过批处理将上述脚本重组为如下格式,并输出到delete.sql文本中
DELETE FROM `table1` WHERE `field1`='value1' AND `field2`='value2' AND `field3`= 'value3' AND `field4`= 'value4' ;
DELETE FROM `table2` WHERE `field1`='value1' AND `field2`='value2' AND `field3`= 'value3' AND `field4`= 'value4' AND `field6`= 'value6' ;
......

里面还有个复杂的需求,就是如果碰到字段值为NULL的话(例如表2的field5字段的值为NULL),则忽略掉这个字段的条件,在delete语句中不用列出该条件。
不知道有那位老师可以伸手援助,万分感激。

来个gawk的。
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set txt=insert.sql
  4. gawk "BEGIN{FS=\"\\(^|\\)^| \\(^|\\) ^|, ^| \";}{count=(NF-5)/2;printf(\"DELETE FROM %%s WHERE\",$3);for(i=1;i<=count;i++){if($(i+count+4)==\"NULL\")continue;if(i==count){printf(\" %%s=%%s;\n\",$(i+3),$(i+count+4));}else{printf(\" %%s=%%s AND\",$(i+3),$(i+count+4));}}}" !txt!
  5. pause
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

apang老师,运行完美。谢谢 谢谢。术业有专攻啊,真是厉害。

TOP

  1. @echo off
  2. (for /f "tokens=1-4 delims=()" %%a in (insert.sql) do (
  3.         setlocal enabledelayedexpansion
  4.         set "s=%%a"
  5.         set "s=!s:INSERT INTO=DELETE FROM!WHERE"
  6.         for %%i in (%%b) do set /a n+=1 & set "_!n!=%%i"
  7.         for %%i in (%%d) do (
  8.                 set /a m+=1
  9.                 if /i "%%i" NEQ "NULL" (
  10.                         for %%j in (!m!) do set "s=!s! !_%%j!=%%i AND"
  11.                 )
  12.         )
  13.         echo,!s:~,-4!;
  14.         endlocal
  15. ))>delete.sql
  16. pause
复制代码
1

评分人数

    • slovent: 由衷感激并佩服技术 + 1

TOP

返回列表