文字列を個別の変数に分割する


回答:


140

このような?

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

7
あなたが持っている場合は"FirstPart SecondPart ThirdPart"2つだけをして欲しい、あなたが使用することができます$a,$b = $string.split(' ')[0,1]
Stoinov

$ string = 'FirstPart-SecondPart'および$ a、$ b = $ string.split( '-')がある場合は、.. Trim()($ a、$ b = $ string.split( '-'))を追加します。 .Trim())、次に$ aと$ bの両方がトリミングされます
mortenma 7120

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 2016

2
また、ワンライナーすることができます:$first_word = ("one-two-three" -split '-')[0]
information_interchange

2
@ sxc731:.Split()常に配列を返すため、@(...):の必要はありませんが、$arr = $myString.split(' ')PowerShellの慣用的なソリューションである$arr = $myString -split ' '、がすでに回答の一部になっていることに注意してください。ドゥ・ノートでは、しかし、それは-splitとり正規表現をし、大文字と小文字を区別しない(使用され-csplit、大文字と小文字を区別分割のため)。
mklement0

25

2つの手法の次の違いに注意することが重要です。

$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() 方法がわかります。

  • 大文字と小文字を区別する分割を実行します(「ALLRIGHT」は「R」で分割されますが、「broken」は「r」で分割されないことに注意してください)
  • 文字列を分割可能な文字のリストとして扱います

一方で-split オペレータ

  • 大文字と小文字を区別しない比較を実行します
  • 文字列全体でのみ分割されます

4
これらは指摘すべき良い違いです。別の重要なのはつまり-splitかかる正規表現のに対し、その(最初の)RHSとして(正規表現)をオペランド[string]タイプの.Split()方法は、上で動作リテラル文字の文字/配列/と- .NETのコア-もリテラル文字列。また、PowerShellの適切な構文は$Str -split '<BR />';であることに注意してください。疑似メソッドの構文は、一方で$Str -Split("<BR />") はどうなる、この場合には仕事、それは避けるべきです。
mklement0 2018年

9

これを試して:

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

ConvertFrom-Stringがより良いソリューションです。ConvertFrom-Stringは、実際には情報の文字列を分割して客体化するという特定の目的で設計されていることに注意してください。これはまさにOPが望んでいることです。分割コマンドレットは機能しますが、OPが望むものを取得するには追加の操作が必要であり、ConvertFrom-Stringが処理することにも注意してください。
danno

1
@danstermeister:一般に、単純な文字列分割にコマンドレットを使用するのは非効率的です。具体的にConvertFrom-Stringは、廃止されているため、避ける必要があります(常に実験的な感覚があり、将来の開発努力が集中しているPowerShell Coreに含まれていないという事実は、ここにとどまらないことを示しています)。追加の操作の必要性について:破壊的な割り当ては次のことを行います:$val1, $val2 = 'FirstPart SecondPart' -split ' '
mklement0 2018年

デフォルトでそれを行うことができます:$ Object = 'FirstPart SecondPart' | ConvertFrom-Csv -d '' -H Val1、Val2(Core 6と同じ);)
Esperento 5718年

1
@ mklement0-PowerShell開発者は、バックエンドの作業が必要なため、これまですべてのWindows中心のアイテムをインポートしていませんでしたが、実際の機能パリティの達成には時間がかかっています。したがって、Windows PowerShellで特に非推奨にならない限り、必ずしも数える必要はありません。たとえば、netadapterコマンドは近い将来移植されると思いますが、現在は存在しません。現在Coreに存在しないというだけで、将来のCoreに存在することをまったく予測できません。また、コマンドレットの効率に関する懸念は、ドライブバイスクリプターではなく、実際の開発者に任せたほうがよいでしょう。
danno

@danstermeister:確かに、それ以上の情報がない場合、現在の不在から移植されないこと推測することできません。優先順位がなかっただけです。ただし、これは重要なポイントです。なぜなら、ConvertFrom-String固有の問題はすべて、それを回避するのに十分な理由だからです。起因して、これは特に、テンプレートベースの解析に適用されますが、それでも区切り文字ベースの解析は欠陥がある型推論され、常に適用-参照stackoverflow.com/a/50166580/45375を
mklement0 2018年

0

Foreachオブジェクト操作ステートメント:

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

hi
there
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.