我有injar
格式的字符串
在批处理中,SELECT sum(QTY), DATE, NAME FROM SELLS WHERE DATE BETWEEN .... GROUP BY DATE,NAME
的两边都是可变长度的。我想打破字符串并检索两个子字符串。我该怎么做呢?
更新:这是我尝试解决问题的方法。
12341234;Super Coca Cola
我得到的是输出:
;
clients.txt文件:
for /F "tokens=*" %%Z in ('type "C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts\clients.txt"') do (
for /f "delims=; tokens=1,2" %%B in (%%Z) do (
echo %%B
echo %%C
)
)
pause
这是什么“系统无法找到文件2”的东西?我希望它回显“2”,第一个字符串的第一部分。但似乎它正试图访问一个名为2的文件。这是什么?
答案 0 :(得分:3)
在分隔符上拆分字符串是批处理for
循环的内置功能。在命令行上使用for /?
来查看语法。您需要使用delims
和tokens
选项。
set "my_string=12341234;Super Coca Cola"
for /f "delims=; tokens=1,2" %%a in ("%my_string%") do (
echo %%a
echo %%b
)
如果您的字符串在文件中,则需要循环来遍历文件中的所有行。您只需将for循环参数从字符串更改为文件名,循环将为您完成所有操作。
for /f "usebackq delims=; tokens=1,2" %%a in ("data.txt") do (
echo first: %%~a
echo second: %%~b
)
如果出于某种原因需要在尝试拆分之前根据该行做出决策,则可以使用嵌套的for
循环。外部可以读取线,内部可以分开。请注意,如果在外部循环中设置变量,则必须使用延迟扩展来查看内部变量。这是一个例子。
@echo off
setlocal enabledelayedexpansion
for /f "usebackq delims=" %%l in ("data.txt") do (
set "line=%%~l"
REM Note that inside the outer loop we use !line! and not %line%.
echo Processing "!line!".
for /f "delims=; tokens=1,2" %%a in ("!line!") do (
echo first: %%~a
echo second: %%~b
)
)
答案 1 :(得分:2)
我比你想象的容易:
for /F "usebackq tokens=1,2 delims=;" %%a in ("C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts\clients.txt") do (
echo %%a
echo %%b
)
pause
您需要文件名的引号,因为它包含空格。但for
会将其解释为字符串,而不是引号中的文件名。因此,您还需要usebackq
告诉for
,引号不代表“字符串”。
PS:您的解决方案也可以将%%Z
作为字符串处理,方法是将其用引号括起来(不含usebackq
,因为这次,您希望它是一个字符串字符串,而不是文件名):
for /f "delims=; tokens=1,2" %%B in ("%%Z") do (