एक स्ट्रिंग को अलग-अलग चर में विभाजित करना


82

मेरे पास एक स्ट्रिंग है, जिसे मैंने कोड का उपयोग करके विभाजित किया है $CreateDT.Split(" ")। मैं अब अलग-अलग तरीकों से दो अलग-अलग तारों में हेरफेर करना चाहता हूं। मैं इन्हें दो चर में कैसे अलग कर सकता हूं?


जवाबों:


140

ऐशे ही?

$string = 'FirstPart SecondPart'
$a,$b = $string.split(' ')
$a
$b

7
यदि आपके पास है "FirstPart SecondPart ThirdPart"और केवल दो चाहते हैं, तो आप उपयोग कर सकते हैं$a,$b = $string.split(' ')[0,1]
स्टोइनोव

यदि आपके पास $ string = 'FirstPart - SecondPart' और $ a, $ b = $ string.split ('-'), add ..Trim () ($ a, $ b = $ string.split ('-) है) .Trim ()), तो $ a और $ b दोनों को छंटनी होती है
Mortenma71

52

-splitऑपरेटर के साथ एक सरणी बनाई जाती है । इस तरह,

$myString="Four score and seven years ago"
$arr = $myString -split ' '
$arr # Print output
Four
score
and
seven
years
ago

जब आपको एक निश्चित आइटम की आवश्यकता होती है, तो इसे तक पहुंचने के लिए ऐरे इंडेक्स का उपयोग करें। मन जो सूचकांक शून्य से शुरू होता है। इस तरह,

$arr[2] # 3rd element
and
$arr[4] # 5th element
years

6
या समकक्ष:$arr = @($myString.split(' '))
sxc731

2
: इसके अलावा एक एक लाइनर हो सकता है$first_word = ("one-two-three" -split '-')[0]
information_interchange

2
@ sxc731: .Split()हमेशा एक सरणी देता है, इसलिए इसकी कोई आवश्यकता नहीं है @(...): $arr = $myString.split(' ')लेकिन ध्यान दें कि अधिक PowerShell-idiomatic समाधान, $arr = $myString -split ' 'पहले से ही उत्तर का हिस्सा है। हालाँकि, ध्यान दें कि -splitयह एक रेक्सक्स लेता है और केस-असंवेदनशील ( -csplitकेस-सेंसिटिव बंटवारे के लिए उपयोग ) है।
mklement0

25

दो तकनीकों के बीच निम्नलिखित अंतर को नोट करना महत्वपूर्ण है:

$Str="This is the<BR />source string<BR />ALL RIGHT"
$Str.Split("<BR />")
This
is
the
(multiple blank lines)
source
string
(multiple blank lines)
ALL
IGHT
$Str -Split("<BR />")
This is the
source string
ALL RIGHT 

इससे आप देख सकते हैं कि string.split() विधि :

  • एक केस संवेदनशील विभाजन करता है (ध्यान दें कि "R" पर उसका विभाजन "ALL RIGHT" है लेकिन "r" पर "टूट" नहीं है)
  • स्ट्रिंग को विभाजित करने के लिए संभावित पात्रों की सूची के रूप में मानता है

जबकि -split ऑपरेटर :

  • केस-असंवेदनशील तुलना करता है
  • केवल पूरे स्ट्रिंग पर विभाजित होता है

4
ये इंगित करने के लिए अच्छे अंतर हैं; एक और महत्वपूर्ण एक है कि है -splitएक लेता है regex जबकि के रूप में अपनी (प्रथम) आरएचएस (नियमित अभिव्यक्ति) संकार्य, [string]इस किस्म की .Split()विधि एक पर चल रही शाब्दिक पात्रों के चरित्र / सरणी / और - .NET में कोर भी एक शाब्दिक - स्ट्रिंग । यह भी ध्यान दें कि PowerShell में उचित सिंटैक्स है $Str -split '<BR />'; जबकि छद्म विधि वाक्यविन्यास इस मामले में काम $Str -Split("<BR />") करने के लिए होता है , इसे टाला जाना चाहिए।
mklement0

9

इसे इस्तेमाल करे:

$Object = 'FirstPart SecondPart' | ConvertFrom-String -PropertyNames Val1, Val2
$Object.Val1
$Object.Val2

ConvertFrom- स्ट्रिंग बेहतर समाधान है। यह ध्यान दिया जाना चाहिए कि ConvertFrom-String वास्तव में सूचना के विभाजन और ऑब्जेक्टिंग स्ट्रिंग्स के विशिष्ट इरादे के साथ डिज़ाइन किया गया है, जो कि वास्तव में ओपी की इच्छा है। यह भी ध्यान दिया जाना चाहिए कि जब विभाजन कमांडलेट काम करता है, तो ओपी इच्छाओं को प्राप्त करने के लिए अतिरिक्त हेरफेर करता है, कुछ ConvertFrom-स्ट्रिंग का ख्याल रखता है।
danno

1
@danstermeister: आम तौर पर, सरल स्ट्रिंग विभाजन के लिए एक cmdlet का उपयोग करना अक्षम है। विशेष रूप से, ConvertFrom-Stringअप्रचलित है और इसे टाला जाना चाहिए (यह हमेशा एक प्रयोगात्मक अनुभव था और तथ्य यह है कि इसे PowerShell Core में शामिल नहीं किया गया है, जहां भविष्य के विकास के प्रयास केंद्रित हैं, यह इंगित करता है कि यह यहां रहने के लिए नहीं है)। अतिरिक्त हेरफेर की आवश्यकता के लिए: एक विनाशकारी असाइनमेंट करेगा:$val1, $val2 = 'FirstPart SecondPart' -split ' '
mklement0

डिफ़ॉल्ट रूप से आप यह कर सकते हैं: $ Object = 'FirstPart SecondPart' ConvertFrom-Csv -d '' -H Val1, Val2 (कोर 6 के साथ ही);)
Esperento57

1
@ mklement0 - PowerShell dev ने बैकएंड कार्य आवश्यक होने के कारण अब तक सभी विंडोज़-केंद्रित वस्तुओं का आयात नहीं किया, लेकिन वास्तविक सुविधा-समता के लिए इसे प्राप्त करना धीमा कर रहे हैं। इसलिए जब तक कि इसे विशेष रूप से खिड़कियों के शिलान्यास में नहीं हटाया गया था, तब तक मैं इसे जरूरी नहीं समझूंगा। उदाहरण के लिए, नेटैडपैड कमांड, मेरा मानना ​​है कि निकट भविष्य में पोर्ट किया जाएगा, लेकिन आज मौजूद नहीं है। यह वर्तमान में केवल कोर में अनुपस्थिति है भविष्य में कोर में इसके अस्तित्व का कोई पूर्वसूचक नहीं है। और cmdlet दक्षता चिंताएं वास्तविक देवों के लिए बेहतर हैं, न कि ड्राइव-बाय स्क्रिप्टर्स के लिए।
डैनो

@danstermeister: सच है, आगे की जानकारी के अभाव में, आप यह अनुमान नहीं लगा सकते हैं कि इसे वर्तमान अनुपस्थिति से चित्रित नहीं किया जाएगा - केवल यह कि यह प्राथमिकता नहीं थी । यह एक विवादास्पद मुद्दा है, तथापि, क्योंकि के सभी ConvertFrom-Stringके निहित समस्याओं कारण पर्याप्त यह से बचने के लिए कर रहे हैं। यह विशेष रूप से टेम्पलेट आधारित पार्स पर लागू होता है, लेकिन फिर भी सीमांकक आधारित पार्स त्रुटिपूर्ण है, के कारण प्रकार निष्कर्ष है कि सदा ही लागू किया - देख stackoverflow.com/a/50166580/45375
mklement0

0

Foreach-object ऑपरेशन स्टेटमेंट:

$a,$b = 'hi.there' | foreach split .
$a,$b

hi
there
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.