Tag: powershell

[PowerShell] csv 読み込み,行数で型が違った件

まず,はじめに動作環境は Windows Server2008 R2です.
$PSVersionTable は下記.

#Powershell 初心者です.自分備忘録なので,正しいとは限りません.そこのとこよろしくお願いいたします

タイトルどおりの件なのですが,自分が引っかかってなかなか気づかなかったので備忘録として.
結論からいうと,1行なのか,複数行かによって各要素へのアクセス方法が違った感じです.

やりたいこと
{,} 区切りの csv を読み込んで,一行ずつ処理をすること.
PSv3 なら,{Import-Csv} を使えば, encoding も一緒にかけて,幸せ.

ただ,今回はPSv2での読み込みなので,Import-CSVはちょっと置いておきますね.
データは,こんな感じに用意します.

サンプルデータ:sample_3.csv

とりあえず,読み込み・

結果表示.

そうそう,ちゃんと読み取れてますね.

各要素にアクセスしたいときは,こんな感じ.

結果.

と,ここまでは順調なんですね.

私がハマったのは,データが1行分しかないときです.

サンプルデータ:sample_1.csv

同様に,読み込みます.

もちろん,ちゃんと読み取れてます.私には,先ほどとかわりがわからない…

私の中では,$line.length は 1 になり, $line[0].name のようにアクセスできるものだと思っていました.まぁ,やってみると,怒られます.

型 System.Management.Automation.PSObject のオブジェクトにインデックスを付けることはできません。

どういうことなの?と思って,型を調べてみると↓

PSCustomObject?たしかに,エラーメッセージにも書いてある….
え,じゃあ複数行の時は??

Array とか書いてある,たしかに複数行っぽく認識してる….

ということで,1行のときは配列として認識しないようです.
アクセスするときは,

$line.name , $line.sex, $line.age

みたいにしてあげるべきみたいですね.
CSVを読み込んで,別のコマンドに渡す,というようなスクリプトを書いていたのでテストデータを1行にすると
ずっと処理が正しく進まないので,不思議に思ってたらこういうことでした.
Get-content で Convert するときは,1行か複数行かちゃんと判別しないとダメなのかな.
Import-Csv もそのうち,調べてみます.