找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26532|回复: 3

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

[复制链接]
发表于 2015-1-15 01:33:16 | 显示全部楼层 |阅读模式
本帖最后由 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语句中不用列出该条件。
不知道有那位老师可以伸手援助,万分感激。
发表于 2015-1-15 09:19:28 | 显示全部楼层
  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技术 +1 收起 理由
slovent + 1 由衷感激并佩服

查看全部评分

 楼主| 发表于 2015-1-15 09:28:04 | 显示全部楼层
apang老师,运行完美。谢谢 谢谢。术业有专攻啊,真是厉害。
发表于 2015-1-15 16:53:16 | 显示全部楼层
来个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技术 +1 收起 理由
CrLf + 1 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 20:16 , Processed in 0.020375 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表