批处理 - 将字符串分成两个子字符串除以分隔字符

时间:2015-05-12 15:56:19

标签: batch-file

我有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的文件。这是什么?

2 个答案:

答案 0 :(得分:3)

在分隔符上拆分字符串是批处理for循环的内置功能。在命令行上使用for /?来查看语法。您需要使用delimstokens选项。

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 (