我有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值。
知道我哪里出错了吗?我可能完全走错路,有一种更简单的方法,但我需要能够在没有用户互动的情况下每晚完成这项工作。任何帮助表示赞赏!!
答案 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”的描述。这似乎是你在寻找的。 p>
http://blogs.msdn.com/b/powershell/archive/2012/07/13/join-object.aspx