2017-01-31 10 views
0

私はインポートされたCSVでpowershellで作業しています。私はこのようなデータセットを持っています:ハッシュテーブルのPSObject配列にインデックスを付ける方法

ID   First_Name        Last_Nam 
--    ----------        -------- 
2314    Kenny         Anderson 
21588   Mark         Anderson 
2547    Ben          Andrews 
5797    Benjamin        Armour 

2000人以上の列を除きます。現在、データは一連のハッシュとして@{ID = "..",First_Name:"..",Last_Name:".."}に格納され、これらはシステムオブジェクト配列に格納されます。私は各ハッシュを配列のインデックスとして保存したい。私は、そのインデックスでハッシュテーブルを取得したいが、私はSystem.Object配列への方法を知らない。ここに私のコードです:

$csv = import-csv $csv_name 
$row = @(0)*csv.length 
$hash = @{} 

for($i =0; $i -lt $csv.length; $i++){ 
$row[$i] += $csv[$i] 
} 

#error: cannot convert "@{ID : "..", First_Name: "..", Last_Name:".." to Systems.Int32 

for($i =0; $i -lt $csv.length; $i++){ 
$csv[$i].psobject.properties | Foreach { $hash[$_.Name] = $_.Value } 

$row[$i]+=$hash 
} 

#error: Cannot convert systems.collections.hashtable into Systems.Int32 

私はそのインデックスでハッシュテーブルを得ることができるように配列をインデックスする方法を探しています。配列を介してアクセス可能なハッシュテーブルへのポインタを持つ最初のものは、私が扱うのが最も簡単だと思います。特定のハッシュテーブルをSystem.Object []自体から取得する簡単な方法がある場合は、教えてください。

私は、事前に列の名前や量を知らないと思います。

+0

'+ ='は、配列全体を再作成してコピーするときに恐ろしい方法です.eac h時間。適切な方法は、1)ループ出力 '$ arr = foreach(...){.....; $ element} 'または2)ArrayListです。より多くの例を見つけることができます。 – wOxxOm

+0

@wOxxOmあなたもこれを別の質問に載せているのを見て、それは良いアドバイスだとは思わない。大部分のケースでは、タスク全体へのパフォーマンスへの影響は無視できるか、または目立たない。 '+ ='ははるかに読みやすく明瞭ですが、これは通常より望ましい特性です。いろいろなやり方のパフォーマンスの側面を知ることは良いことですが、 '+ ='はひどいものであり、不適切なものはストレッチですと私の意見では思います。 – briantist

+0

@briantist、ループやパイプラインからの出力を収集することは、配列が小さい場合でも、よりシンプルで、高速で、読みやすく、より多くの 'poshy'です。 – wOxxOm

答えて

3

戻り値Import-Csv[hashtable]の配列ではなく、[psobject]の配列です。各列はプロパティです。

個々のオブジェクトをインデックスで取得するための配列を作成する必要はありません。

$csv = import-csv $csv_name 
$csv[0] 
$csv[1].First_Name 
# etc 

あなたのコードのエラーは、あなたの疑問には関係ありません。実際にオブジェクト型またはハッシュテーブルをinteger型の既存の配列要素に追加しようとしているので、配列にオブジェクトを追加しようとするとエラーが発生します。

あなたがゼロの束を持つ配列を事前に作成する必要はありませんので、この行は必要ありません。

$row = @() 

$row = @(0)*csv.length 

代わりに、あなたは空の配列を作成することができます

$row += $hash 
関連する問題