2011-12-13 12 views
14

कहें कि मेरे पास एक स्ट्रिंग है जैसे foo: bar: baz, क्या यह स्ट्रिंग के माध्यम से लूप करना संभव है? ऐसा लगता है कि आप एक फ़ाइल की लाइनों को टोकननाइज़ कर सकते हैं लेकिन निम्नलिखित केवल एक बार 'foo' गूंजेंगे।स्ट्रिंग में टोकन के माध्यम से कैसे लूप करें?

for /f "tokens=1,2* delims=:" %%x in ("%%j") do echo %%x

उत्तर

16
set string=foo:bar:baz 
for %%x in (%string::= %) do echo %%x 

के लिए मूल्य delimiters अंतरिक्ष, अल्पविराम, अर्धविराम और बराबर चिह्न हो सकता है। यदि तत्व इन वर्णों में से किसी के साथ सीमित हैं तो आप सीधे स्ट्रिंग को संसाधित कर सकते हैं। यदि नहीं, तो बस इन वर्णों में से एक के लिए डिलीमीटर बदलें (जैसा मैंने ऊपर किया था)।

set string=foo bar,baz;one=two 
for %%x in (%string%) do echo %%x 
+0

+1 बहुत आसान! –

2

यह है के रूप में उम्मीद है, यह इसके %%x%%y%%z को tokenizes। तो बजाय सिर्फ %%x प्रसंस्करण, आप हो सकता है ...

for /f "tokens=* delims=:" %%x in ("foo:bar:baz") do (
    echo %%x 
    echo %%y 
    echo %%z 
) 

या आप पहले से कितने आइटम आप मिल गया पता नहीं है, तो आप कर सकते हैं ...

@echo off 
set string=foo:bar:baz 
:again 
for /f "tokens=1* delims=:" %%x in ("%string%") do (
    echo %%x 
    set string=%%y 
) 
if not .%string%==. goto again 
echo done 
+0

हम्म, मुझे लगता है कि मैं क्या चाहता हूँ की तरह मैं एक फ़ाइल की पंक्तियों के माध्यम से लूप कर सकते हैं टोकन लूप करने के लिए सक्षम होने के लिए है एक ऐसा करने का अच्छा तरीका: http://stackoverflow.com/questions/6966558/batch-file-for-f-tokens –

8

एसीनी ने मुझे अपने पहले समाधान में हराया। उद्धरण जोड़कर इसे बेहतर किया जा सकता है ताकि स्ट्रिंग में रिक्त स्थान और विशेष वर्ण हो और फिर भी सही परिणाम दें।

  • नहीं * या:

    set "str=foo bar:biz bang:this & that" 
    for %%S in ("%str::=" "%") do echo %%~S 
    

    समाधान सीमाएँ हैं? स्ट्रिंग

  • समस्याएं पैदा कर सकते हैं स्ट्रिंग पहले से ही कोट (") में शामिल है में दिखाई दे सकता है, खासकर अगर वहाँ विशेष वर्ण के साथ-साथ

दूसरा समाधान कर रहे हैं विचित्र वाक्य रचना है, लेकिन अवधारणा काफी सीधे आगे है। "स्ट्रिंग" के साथ फॉर/एफ लाइनफीड वर्णों पर टूट जाएगा - प्रत्येक पंक्ति को अपनी स्ट्रिंग के रूप में संसाधित किया जाएगा। यह चाल : डिलीमीटर को लाइनफ़ेड वर्ण के साथ प्रतिस्थापित करने के लिए है। ध्यान दें कि नीचे दिए गए समाधान में खाली रेखा का एक महत्वपूर्ण हिस्सा है मुश्किल प्रतिस्थापन। साथ ही, निम्नलिखित पंक्ति ! से शुरू होनी चाहिए जो देरी परिवर्तनीय विस्तार को समाप्त कर दे। कोई भी प्रमुख स्थान नहीं होना चाहिए।

चिंता करने की दूसरी बात यह है कि फिसकी फॉर/एफ "ईओएल" विकल्प है। हम ईओएल चरित्र से शुरू होने वाले किसी भी मूल्य को छोड़ना नहीं चाहते हैं जो डिफ़ॉल्ट रूप से ; है। चूंकि हमने स्ट्रिंग डेलीमीटर : को समाप्त कर दिया है, इसलिए हम इसे ईओएल के रूप में सुरक्षित रूप से उपयोग कर सकते हैं।

अंत में, हमें देरी से विस्तार का उपयोग करने की आवश्यकता है, लेकिन ! %% एस विस्तार के दौरान दूषित हो जाएगा यदि हम पहले लूप के भीतर देरी विस्तार को अक्षम नहीं करते हैं।

set "str=foo bar:biz bang:this & that "^& the other thing!":;How does this work?" 
setlocal enableDelayedExpansion 
set ^"str=!str::=^ 

!" 
for /f "eol=: delims=" %%S in ("!str!") do (
    if "!!"=="" endlocal 
    echo %%S 
) 

मेरा मानना ​​है कि यह तकनीक उस चीज़ के बारे में कुछ भी संभाल सकती है जो आप इसे फेंकते हैं।

जेब मुझे दिखाने के लिए पहला था कि बैच के भीतर लाइन फीड के साथ कैसे काम करना है, और विशेष रूप से इस तकनीक का उपयोग कैसे करें। यह एसओ पर कहीं और कहीं भी पोस्ट किया जा सकता है।

+0

क्या आप मुझे बता सकते हैं कि आप पहले उद्धरण चिह्न से क्यों बच रहे हैं जैसे '^" स्ट्रिंग प्रतिस्थापन पर? और आप दूसरे से क्यों नहीं बचते हैं? – aschipfl

+0

आह अरे, बेवकूफ मुझे! मुझे पता चला: एक अनचाहे '' '' '' को शाब्दिक रूप से रखा जाएगा ... अजीब तरह से मैंने पाया कोड का परीक्षण करके नहीं बल्कि कुछ सह में भाग लेना जब मैंने टिप्पणी पोस्ट की है तो काफी अलग है; काफी बेवकूफ, है ना? ;-) – aschipfl

1

इस चर में स्ट्रिंग पार्स जाएगा पाश (के बाहर सुलभ;।

setlocal enabledelayedexpansion 

set your_string="whatever:you:want" 

for /f "tokens=1,2,3 delims=:" %%a in ('echo !your_string!') do (
    set first_sub_string=%%a 
    set second_sub_string=%%b 
    set third_sub_string=%%c 
) 

echo Congrats. !your_string! was parsed as !first_sub_string!, !second_sub_string!, !third_sub_string! 
संबंधित मुद्दे