2017-07-14 55 views
2

私は2つのcsvファイルを持っています。ファイルAからファイルBへの新しい列を新しいファイルに追加します。 ATM、それは powershellで2つのcsvファイルをマージする

A.

ファイルA.csv

ID Name 

1  Peter 

2  Dalas 
からの値を取ることはありませんファイルB.CSV

Class 

Math 

Physic 

新しいファイルは次のようになります。

ID Name Class 

1  Peter Math 

2  Dalas Physics 

両方のファイルの行数は同じです。私が使用しているコードは、次の、私は今、どのようにファイルAから値を取るようにしたいとファイルBに入れ

$CSV1 = Import-Csv ".\A.csv" 
$CSV2 = Import-Csv ".\B.csv" 


$CSV1 | ForEach-Object { 
    $Value= $_ 
    $CSV2 | Select-Object *, @{Name='Information';Expression={ $Value}} 

} | Export-Csv "C.csv" -NoTypeInformation 
+1

それらのインデックスに基づいて**オブジェクト**(ファイルではなく)を結合することに関係しています。 '$ 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

答えて

1

として

あなたの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 
+0

素晴らしい! tks so much :) – Ender

+0

しかし、あなたはファイル名が不足していると思います。私は '$ CSV1 | ForEach-Object ..... '〜' $ CSV2 | ForEach-Object ...... 'のようになります。と '値$ CSV2 [$ i ++]。クラス.....'〜値 '$ CSV1 [$ i ++]。クラス.......'はファイルAからファイルBへの私の質問に合致する:)。 – Ender

+1

私はあなたのやり方を示す答えを編集しました。 –

関連する問題