として
あなたの2つのCSVファイルが正しく整列されていると仮定すると、 (たとえば、あなたはそれらの行番号に基づいてデータをマージしたいと他のキーによってリンクされていない)私は、次のことをお勧め:
$CSV1 = Import-Csv ".\A.csv"
$CSV2 = Import-Csv ".\B.csv"
$CSV1 | ForEach-Object -Begin {$i = 0} {
$_ | Add-Member -MemberType NoteProperty -Name 'Class' -Value $CSV2[$i++].Class -PassThru
} | Export-Csv "C.csv" -NoTypeInformation
説明:
-Begin
スクリプトブロックを使用してカウンタを0に設定します(ForEach-Object
の前にこれを行うことができますが、-Begin
を使用してその目的をコードブロックにうまくリンクします)。
- CSV2の行の配列インデックスを使用して(そして、そのインデックスを
++
でインクリメントして)インクリメントして、CSV1の各行に 'Class'プロパティを追加します。
-PassThru
スイッチを使用して、オブジェクトをパイプラインに戻します。
あなたはそれを他の方法で回避(B> A)を行いたい場合は、同じアプローチを取ることができるが、このようにそれを実行する必要があります:
$CSV2 | ForEach-Object -Begin {$i = 0} {
$CSV1[$i++] | Add-Member -MemberType NoteProperty -Name 'Class' -Value $_.Class -PassThru
} | Export-Csv "C.csv" -NoTypeInformation
私は実際によ驚いた$_.Class
はまだ新しいパイプラインの反対側として動作しますが、それはそうです。
は
はまた、あなた元々の計画のような計算式を使用することができますが、その後、あなたが原因の余分なパイプラインに$Class
を保存するために、余分な変数を使用する必要があります:タイトルは、コンテンツを複製示唆しているが
$CSV2 | ForEach-Object -Begin {$i = 0} {
$Class = $_.Class
$CSV1[$i++] | Select @{Name='Class';Expression={$Class}},*
} | Export-Csv "C.csv" -NoTypeInformation
それらのインデックスに基づいて**オブジェクト**(ファイルではなく)を結合することに関係しています。 '$ CSV1 | $ CSV2 {$ LeftIndex -eq $ RightIndex}に参加する、以下の文書化されていない機能:https://stackoverflow.com/questions/1848821/in-powershell-whats-the-best-way-to-join-two-tables-into -one/45483110#45483110 – iRon