web-dev-qa-db-ja.com

PowerShellは、部分文字列/文字の最初の出現時に文字列を分割します

2つの部分に分割する文字列があります。最初の部分はコンマの前(,)で、2番目の部分はすべてコンマの後の部分(コンマを含む)です。

変数$Headerのコンマの前の最初のピースを取得できましたが、1つの大きな文字列の最初のcommaの後のピースを取得する方法がわからないため、

$Content = "Text 1,Text 2,Text 3,Text 4," 

テキスト5、テキスト6などのように、ここに表示されるテキストがさらにある場合があります。

$String = "Header text,Text 1,Text 2,Text 3,Text 4,"

$Header = $String.Split(',')[0] //<-- $Header = "Header text"
13
DarkLite1

PowerShellの-split演算子は、返される部分文字列の最大数、つまり返される部分文字列の数の指定をサポートしています。分割するパターンの後に、戻したい文字列の数を指定します。

$header,$columns = "Header text,Text 1,Text 2,Text 3,Text 4," -split ',',2
23
Aaron Jensen

次のようなものを試してください:

$Content=$String.Split([string[]]"$Header,", [StringSplitOptions]"None")[1]

文字列に従って分割するとき、関数splitの異なるシグネチャを使用しています。

基本的な使用に必要な引数は1つだけで、区切り文字が必要です(詳細については here などを参照してください)。ただし、文字列を使用するための署名は次のとおりです。

System.String[] Split(String[] separator, StringSplitOptions options)

これが、文字列を文字列の配列としてキャストする必要がある理由です。この場合はNoneオプションを使用しますが、splitのドキュメントで他のオプションを利用できます。

最後に、$Heasder,の値は$Stringの先頭にあるため、結果の配列の2番目のメンバーをキャッチする必要があります。

3
Aserre

アーロンの方法は最高ですが、私は私の解決策を提案します

$array="Header text,Text 1,Text 2,Text 3,Text 4," -split ','
$array[0],($array[1..($array.Length -1)] -join ",")
1
Esperento57

この代替ソリューションでは、単一の割り当てで配列を複数の変数に分散するPowerShellの機能を利用しています。ただし、-split演算子はカンマごとに分割され、PowerShellの組み込みの配列から文字列への変換により、要素が連結されます。したがって、String.Splitほど効率的ではありませんが、あなたの例では無視できます。

$OFS = ','
$Content = 'Header text,Text 1,Text 2,Text 3,Text 4,'

[String]$Header,[String]$Rest = $Content -split $OFS

$OFS = ' '
Write-Host "Header = $Header"
Write-Host "Rest   = $Rest"

最後に、$OFSは、配列要素を単一の文字列に戻すときに使用する文字を決定するPowerShellの特別な変数です。デフォルトでは、スペースです。しかし、それは何にでも変更できます。

0
Josh