首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批处理-将字符串拆分为两个子字符串,并由分隔字符分隔。

批处理-将字符串拆分为两个子字符串,并由分隔字符分隔。
EN

Stack Overflow用户
提问于 2015-05-12 15:56:19
回答 2查看 427关注 0票数 2

我有一批12341234;Super Coca Cola格式的字符串,其中;的两边都是可变长度的。我想拆开字符串并检索两个子字符串。我该怎么做呢?

更新:这是我尝试解决一个问题的方法。

代码语言:javascript
复制
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

作为输出我得到了什么:

代码语言:javascript
复制
C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts>fo
r /F "tokens=*" %Z in ('type "C:\Users\daniel.bak\Desktop\Tableau Client Data Ex
tracts\Master Data Extracts\clients.txt"') do (for /F "delims=; tokens=1,2" %B i
n (%Z) do (
echo %B
 echo %C
) )

C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts>(f
or /F "delims=; tokens=1,2" %B in (2;Glaxo Smith Kline) do (
echo %B
 echo %C
) )
The system cannot find the file 2.

C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts>(f
or /F "delims=; tokens=1,2" %B in (3;Merck Canada Inc.) do (
echo
 echo %C
) )
The system cannot find the file 3.

C:\Users\daniel.bak\Desktop\Tableau Client Data Extracts\Master Data Extracts>pa
use
Press any key to continue . . .

clients.txt文件:

代码语言:javascript
复制
2;herpherp
3;derpderp

什么是“系统找不到文件2”的东西?我要它回音"2",第一个字符串的第一部分。但它似乎想要访问一个名为2的文件。怎么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-12 16:16:36

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

代码语言:javascript
复制
set "my_string=12341234;Super Coca Cola"
for /f "delims=; tokens=1,2" %%a in ("%my_string%") do (
    echo %%a
    echo %%b
)

如果您的字符串位于文件中,则需要一个循环来遍历文件中的所有行。您只需将for-loop参数从字符串更改为文件名,循环将为您完成这一切。

代码语言:javascript
复制
for /f "usebackq delims=; tokens=1,2" %%a in ("data.txt") do (
        echo first:  %%~a
        echo second: %%~b
)

如果由于某些原因,在尝试拆分行之前需要根据行进行决策,则可以使用嵌套的for循环。外部可以读取线,内部可以分裂。注意,如果在外部循环中设置变量,则必须使用延迟展开来查看内部的变量。下面是一个例子。

代码语言:javascript
复制
@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
    )
)
票数 3
EN

Stack Overflow用户

发布于 2015-05-12 16:54:19

我比你想象的容易得多:

代码语言:javascript
复制
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,引号并不意味着"string“。

PS:您的解决方案还可以通过用引号将%%Z作为字符串处理(没有usebackq,因为这一次,您希望它是一个字符串,而不是文件名):

代码语言:javascript
复制
for /f "delims=; tokens=1,2" %%B in ("%%Z") do (
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30195915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档