2015-05-12 2 views
1

У меня есть строки в формате 12341234;Super Coca Cola в партии, где обе стороны ; являются переменной длиной. Я хочу разбить строку на части и получить обе подстроки. Как мне это сделать?Пакет - разбить строку на две подстроки, разделенные разделительным символом

Обновление: вот мое попытающееся решение проблемы.

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 

Что я получаю в качестве вывода:

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 файл:

2;herpherp 
3;derpderp 

Что это "система не может найти файл 2" вещи? Я хочу, чтобы это эхо «2», первая часть первой строки. Но похоже, что он пытается получить доступ к файлу с именем 2. Что случилось?

+0

Будут ли всегда только две подстроки? Вы хотите, чтобы '{' и '}' включались в подстроки? – SomethingDark

+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-loop из строки в имя файла, и цикл сделает все это за вас.

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 
    ) 
) 
+0

Спасибо, это была большая помощь. –

+0

Эй. По какой-то причине это, похоже, не работает. Я отправлю новый вопрос. –

+0

Не удалось опубликовать новый вопрос, поэтому я обновил его. –

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 (
+0

Нет, я хочу, чтобы этот процесс выполнялся для каждой строки.Поэтому для каждой строки разбивайте ее на две подстроки и делайте им вещи. Разве это не требует вложенного цикла? Редактировать: nevermind, thanks. Я думал, что вам нужен один для цикла, чтобы пересечь файл, а другой - внутри него, чтобы пересечь каждую строку. Благодаря! –

+0

Вот что делает 'for': беря каждую строку файла и обрабатывая его. В противном случае, также вложенные 'for' не будут работать. – Stephan