比较2个csv文件并根据1列进行匹配,然后导出包含两个字段的新文件

时间:2015-03-05 18:59:19

标签: powershell csv merge

我有2个csv文件。每个都有不同的标题和不同的列数,并有不同的条目数。

以下是前几行的一些例子

CSV 1

    ID,Last_Name,First_Name,Middle_Name,Email_Addr,Title,Gender
    ###1,smith,bill,p,smith@soso.com,boss,m
    ###2,smith2,billy,p,smith2@soso.com,someguy,m

CSV 2

    ID,Name Id,Last Name,First Name,Middle Name,Gender
    ###2,ID1010,smith2,billy,p,M

我正在尝试导入它们并比较ID列。当找到匹配项时,我想要一个新的csv文件,其中包含来自CSV 1的所有信息和来自csv 2的匹配的名称ID。

新CSV示例:

    ID,Last_Name,First_Name,Middle_Name,Email_Addr,Title,Gender,Name Id
    ###1,smith,bill,p,smith@soso.com,boss,m,
    ###2,smith2,billy,p,smith2@soso.com,someguy,m,ID1010

我一直在寻找并且从大约一年前看到这个Stackoverflow似乎在正确的轨道上但我似乎无法根据我的需要修改代码。这是我尝试过的。

    $csv1 = Import-Csv -Path C:\STAFF\test1sky.csv
    $csv2 = Import-Csv -Path C:\STAFF\test1power.csv

    ForEach($Record in $csv2){
    $MatchedValue = (Compare-Object $csv1 $Record -Property "ID" -IncludeEqual -ExcludeDifferent -PassThru).value
    $Record = Add-Member -InputObject $Record -Type NoteProperty -Name "Name Id" -Value $MatchedValue
    }
    $csv2|Export-Csv 'C:\STAFF\combined.csv' -NoTypeInformation

我在新文件中获得了正确的标题,但我从未获得过Name Name值。

知道我哪里出错了吗?我可能完全走错路,有一种更简单的方法,但我需要能够在没有用户互动的情况下每晚完成这项工作。任何帮助表示赞赏!!

3 个答案:

答案 0 :(得分:1)

让我们试着简化一下。添加'名称ID'字段到CSV1中的所有记录。然后遍历它,获取匹配项,并更新字段。类似的东西:

$CSV1 = C:\Path\To\File1.csv
$CSV2 = C:\Path\To\File2.csv
$CSV1|ForEach{$_|Add-Member 'Name ID' $Null}
ForEach($Record in $CSV1){
    $Record.'Name ID' = $CSV2|Where{$_.ID -eq $Record.ID}|Select -Expand 'Name ID'
}

答案 1 :(得分:1)

#!/usr/bin/env python3                                                                                        
import praw                                                                                                   
import sys                                                                                                    


AUTOREPLY_MSG = """\                                                                                          
Hey there, I'm on a vacation for x days.                                                                      

I won't check this account till then. Happy Holidays! """                                                     


def main():                                                                                                   
    r = praw.Reddit('bot1', user_agent='bot1 user agent')                                                     

    for msg in r.inbox.unread(mark_read=True):                                                                
        if isinstance(msg, praw.objects.Message):                                                             
            msg.reply(AUTOREPLY_MSG)                                                                          
            msg.mark_as_read()                                                                                
            print(msg, file=sys.stderr)                                                                       


if __name__ == '__main__':                                                                                    
    main()                                                                                                    
~              

您可以通过操纵CSV2 PS对象添加对CSV1文件的其他引用来轻松获取附加字段。

$CSV1 = import-csv C:\Path\To\File1.csv
$CSV2 = import-csv C:\Path\To\File2.csv

#adds a row named "Name ID" to the PS Object( the CSV Import)
$CSV1|ForEach{$_|Add-Member 'Name ID' $Null}

ForEach($Record in $CSV1){

#gets the value from CSV1 for comparing to CSV2 
$NameValue=Record."Last_Name"

#gets the Power Shell Object from the CSV2 Import that matches the Name ID from $csv1
$Nameobject= $CSV2|Where-object "Last Name" -contains $Namevalue

#Sets the Field "Name ID" in the PS Object $CSV1 Record to the Name ID from $csv2 
$record."Name ID" = $Nameobject."Name ID"
}

由于你有for循环形式$ csv2中的整个对象,你可以调用它的任何字段或使用变量和“| select -Property”值操作它们“像这样

$record."Middle Name" = $nameobject."Middle_Name" 

但是我更喜欢直接从对象中调用它,因为输出看起来比较清晰

$objlength = $nameobject |select "First_Name"
$objlength.length

答案 2 :(得分:0)

您正在寻找的操作称为关系连接。有时它被称为内连接,有时只是连接。我对连接的了解来自SQL,而不是来自Powershell。

这是“Join-Object”的描述。这似乎是你在寻找的。

http://blogs.msdn.com/b/powershell/archive/2012/07/13/join-object.aspx