[Powershell]Get-Contentで読み込んだテキストファイルを確実に1行1要素の配列として取り扱う定型句

結論

Get-Content でテキストファイルを読み込んだ変数は、必ず@()で囲んで取り扱うのがよさげ。

$txt = Get-Content single.txt

# $txtを確実に1行1要素の配列として取り扱って1行目を取得したい!
@($txt)[0]

何が問題か

$txt = Get-Content single.txt
とテキストファイルを読み込んだとき、テキストファイルの中身が1行のみだった場合、$txtがStringの配列ではなくただのStringになります。複数行のテキストファイルならStringの配列になるのに、1行の場合だけStringになります。

その動作を2つのテキストファイルを用意して試してみましょう。

複数行のテキストファイル(multi.txt)
1行のみのテキストファイル(single.txt)

multi.txtをGet-Contentで$mに読み込んで、いろいろやってみます。

$mは配列ですし、インデックスで配列の要素にアクセス出来ています。

しかし、同じ事をsingle.txtでやってみると全然違う結果になります。

$sは配列ではなくStringですし、インデックスでアクセスすると(当然ですが)行単位ではなく○文字目が返ってきます。

つまり、$txt = Get-Content text.txt と読み込んだ変数を$txtのまま使用すると、テキストファイルが1行の場合と複数行の場合で処理内容が変わってしまうということです。

これは困る。テキストファイルを読む以上、常に1行1要素の配列として処理して欲しいことがほとんどのはずです。

なので、$txtは配列ですよと明示することで、この問題を解決します。それが@($txt)と言うわけです。

やってみます。

@($s)は配列ですし、インデックスのアクセスで1行丸ごと返ってきています。インデックス[3]は存在しないので結果なしでOK。

複数行テキストファイルでもやってみます。

意図したとおりの動作になっています。@()で囲むことで配列の配列になってしまった、なんてことはありません。

ということで、Get-Contentでテキストファイルを読み込んだ変数を扱う際には、必ず@()で囲んでアクセスするのが安全と言えそうです。

コメントを残す