2017-07-14 570 views
2

我有2個csv文件,我想從文件A到文件B添加一個新列到一個新文件。 ATM,它不會從A取值在powershell中合併2個csv文件

文件A.csv

ID Name 

1  Peter 

2  Dalas 

文件B.CSV

Class 

Math 

Physic 

新文件將是:

ID Name Class 

1  Peter Math 

2  Dalas Physics 

這兩個文件具有相同的行數。

如下面的我正在使用的代碼,我想現在如何從文件中的取值,並把它放在文件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

假設你的兩個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將其目的很好地鏈接到代碼塊)。
  • 使用Add-Member將'Class'屬性添加到CSV1中的每一行,使用CSV2中行的數組索引(並且與++一樣增加該索引的行數)。
  • 使用-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這麼多:) – Ender

+0

但我認爲你錯過了文件名。我想更改'$ CSV1 | ForEach-Object .....'到'$ CSV2 | ForEach-Object ......'。 AND'-Value $ CSV2 [$ i ++]。Class .....'to'-Value $ CSV1 [$ i ++]。Class .......'與我的問題從文件A到文件B一致:)。 – Ender

+1

我編輯了答案,顯示你如何以相反的方式進行操作。 –