私はインポートされた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 []自体から取得する簡単な方法がある場合は、教えてください。
私は、事前に列の名前や量を知らないと思います。
'+ ='は、配列全体を再作成してコピーするときに恐ろしい方法です.eac h時間。適切な方法は、1)ループ出力 '$ arr = foreach(...){.....; $ element} 'または2)ArrayListです。より多くの例を見つけることができます。 – wOxxOm
@wOxxOmあなたもこれを別の質問に載せているのを見て、それは良いアドバイスだとは思わない。大部分のケースでは、タスク全体へのパフォーマンスへの影響は無視できるか、または目立たない。 '+ ='ははるかに読みやすく明瞭ですが、これは通常より望ましい特性です。いろいろなやり方のパフォーマンスの側面を知ることは良いことですが、 '+ ='はひどいものであり、不適切なものはストレッチですと私の意見では思います。 – briantist
@briantist、ループやパイプラインからの出力を収集することは、配列が小さい場合でも、よりシンプルで、高速で、読みやすく、より多くの 'poshy'です。 – wOxxOm