Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何解析字符串以在单词X和单词Y之间输出其内容?_Batch File - Fatal编程技术网

Batch file 如何解析字符串以在单词X和单词Y之间输出其内容?

Batch file 如何解析字符串以在单词X和单词Y之间输出其内容?,batch-file,Batch File,假设我有一个类似这样的查询,作为批处理脚本中findstr命令的输出: select a, b, c FROM table1, table2, table3 WHERE something happens 还是像这样 select a, b, c from table1 我想选择表名并将它们放在某个地方。 现在,问题是关于第一步“切断”处于FROM和WHERE条件之间的任何东西 或查询的结尾。我检查了批处理字符串管理工具,但似乎没有任何帮助 其中大多数都是基于知道我想要导出的数据的确切位置。

假设我有一个类似这样的查询,作为批处理脚本中findstr命令的输出:

select a, b, c FROM table1, table2, table3 WHERE something happens
还是像这样

select a, b, c from table1
我想选择表名并将它们放在某个地方。 现在,问题是关于第一步“切断”处于FROM和WHERE条件之间的任何东西 或查询的结尾。我检查了批处理字符串管理工具,但似乎没有任何帮助 其中大多数都是基于知道我想要导出的数据的确切位置。为了简单起见 假设没有要修剪的扩展空间,并且从和从何处修剪的空间不超过一个
每查询一个字。有线索吗?

使用带通配符的字符串替换来分隔前缀/后缀

:: Q:\Test\2018\12\06\SO_53652818.cmd
@Echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"

set "suffix=%string:*where=%"
call set "string=%%string: where%suffix%=%%"
set "tables=%string:* from =%%"
set tables

set "string=select a, b, c from table1"

set "suffix=%string:*where=%"
call set "string=%%string: where%suffix%=%%"
set "tables=%string:* from =%%"
set tables
或者将单词where、from更改为单个字符分隔符

@Echo off
set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"

set "string=%string: where =|%"
set "string=%string: from =|%"
for /f "tokens=2 delims=|" %%A in ("%string%") Do set "tables=%%A"
set tables
另一种选择是使用PowerShell作为工具 具有lookaround特性的正则表达式包含零长度断言,从而避免了

更简单:

@echo off

set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"

set "string=%string: WHERE =" & rem "%"
set "string=%string: FROM =" & set "tables=%"

set tables
我可以对所使用的方法进行充分的解释,但如果您只需离线删除@echo,运行程序并仔细检查执行的代码,就会简单得多


如果您有任何进一步的问题,请发表评论。

您说您检查了批处理字符串管理工具,但为什么不分享您的成果呢?请查看set/?特别是%PATH:str1=str2%,如果str以星号开头……当然,既然你提到了它,那么说字符串操作工具会更正确。就我的努力而言,我甚至没有设法通过使用批处理来将可能的工作方式细化,从而将字符串拆分出来。现在我的障碍是,我看不到任何方法可以从一开始就知道确切的字符槽,这样我就可以用可用的操纵操作完成剩余的工作。几分钟前,我意识到我可以制作一个脚本,删除左边的每个字符,直到在字符串开头找到单词from,但我还不确定这是否可行。如果查询没有WHERE,但有groupby或orderby,该怎么办?就此而言,我可能会找到一个解决方案,问题是,我没有找到任何切入点来解决在没有位置语法的情况下操纵字符串的问题。这是个好主意,在我的例子中,第一种方法甚至可以毫无例外地工作。谢谢老板,你的答案总是正确的。如果WHERE子句包含=,第一个方法将失败,这在典型的SQL查询中非常常见。您好,您的代码对我来说非常适合。我添加了问题中没有提到的ecc,如ORDER BY、语法错误ecc。但出于好奇,我很想清楚它是如何工作的,关于你所使用的机制的信息在官方文档中非常混乱,我认为其中有些部分甚至丢失了,但请不要引用我的话,我想更好地理解这句话,特别是:set string=%string:WHERE=&rem%我尝试了回声关闭和一些其他实验,但对我来说仍然是一种黑魔法,你能给我解释一下吗?我很感激。这是一个非常简单的子字符串替换:它只是通过&rem更改字符串中的u,其中u,然后执行剩余的行。我建议您复制相同的过程:打开一个文本文件,从以下行开始:set string=从表1、表2、表3中选择a、b、c,其中发生了一些事情。然后,执行前面的更改。之后,看到结果并意识到这样一行将被执行。。。塔达!你会看到魔法的!不是吗;如果你想看到更多关于这个方法和它的诞生的例子,你确实可以回顾一下,但我警告你,这样的例子并不像这个那么简单。。。
@echo off

set "string=select a, b, c FROM table1, table2, table3 WHERE something happens"

set "string=%string: WHERE =" & rem "%"
set "string=%string: FROM =" & set "tables=%"

set tables