2

スクリプトを作成する必要が突然必要になったため、2 つの csv ファイルを、少なくとも 1 つの共通列を持つ行と列に結合するために、powershell に頼っています。私はPowershellの初心者です。両方のファイルから読み取り、行を比較して共通の列と結合し、最終的に別のファイルに出力する方法を誰かアドバイスできますか?

CSV ファイル 1

Hosts  ABC  DEF
=====  ===  ===
SVR01   10  100
SRV02   22   99

CSV ファイル 2

Hosts  UVW   XYZ
=====  ===   ===
SVR01   13  10.5
SRV02   19   8.9

期待される出力

Hosts  DEF  UVW   XYZ
=====  ===  ===   ===
SVR01  100   13  10.5
SRV02   99   19   8.9

いくつかのガイダンスを求めることを願っています。

ありがとうございました。

4

1 に答える 1

3

ファイルが大きくなりすぎない場合は、共通の列の値をキーとして使用してハッシュ テーブルにファイルを読み込み、2 番目のファイルを繰り返し処理し、キーの値を使用して列を検索し、最初のファイルからマージします。最初のファイルが大きい場合 (何が大きいかは RAM の量に依存します)、その内容全体がメモリにロードされるため、RAM を使いすぎないように注意する必要があります。

#Make an empty hash table for the first file

$File1Values = @{}


#Import the first file and save the rows in the hash table indexed on "KeyColumn"

Import-Csv -Path c:\file1.csv | ForEach-Object {
  $File1Values.Add($_.KeyColumn, $_)
}


#Import the second file, using Select-Object to select all the values from file2,
#  and adding custom properties from the first file using the name/expression
#  hash tables.

Import-Csv -Path c:\file2.csv | Select-Object *,@{
  Name="ABC"; Expression={$File1Values[$_.KeyColumn].ABC}
}, @{
  #You can abbreviate Name/Expression
  N="DEF"; E={$File1Values[$_.KeyColumn].DEF}
} | Export-Csv -Path c:\OutFile.csv

その最後のセクションでは、これらの手法のいずれかを使用することもできます カスタムオブジェクトを作成するための多くの方法 カスタムオブジェクトを作成するために、私は「Select-Object」メソッドを選択しました。最初のファイルから (より複雑な構文を犠牲にして)。

V3 を使用していて、新しい [PsCustomObject] 型アクセラレータを使用する場合、最後の部分は次のようになります (ファイル 1 とファイル 2 の両方のプロパティを手動で追加する必要があることに注意してください)。

#Import the second file and make a custom object with properties from both files

Import-Csv -Path c:\file2.csv | ForEach-Object {
  [PsCustomObject]@{
    ABC = $File1Values[$_.KeyColumn].ABC;
    DEF = $File1Values[$_.KeyColumn].DEF;
    UVW = $_.UVW;
    XYZ = $_.XYZ;
  }
} | Export-Csv -Path c:\OutFile.csv
于 2013-07-17T03:51:33.467 に答える