合并CSV,匹配不同格式的列

合并CSV,匹配不同格式的列,csv,powershell,Csv,Powershell,我有两个CSV,第一个格式如下: Campus ID,Student ID,Grade,Last Name,First Name,Active 1,50000,12,TEST,USER,1 1,600000,12,EXAMPLE,USER,1 Campus ID,Student ID,Grade,Last Name,First Name,Active,Email 1,50000,12,TEST,USER,1,30TestU@example.com 1,600000,12,EXAMPLE,USER

我有两个CSV,第一个格式如下:

Campus ID,Student ID,Grade,Last Name,First Name,Active 1,50000,12,TEST,USER,1 1,600000,12,EXAMPLE,USER,1 Campus ID,Student ID,Grade,Last Name,First Name,Active,Email 1,50000,12,TEST,USER,1,30TestU@example.com 1,600000,12,EXAMPLE,USER,1,40ExampleU@example.com 校园ID、学生ID、年级、姓、名、活动 150000,12,测试,用户,1 1600000,12,示例,用户,1 然后我需要合并另一个CSV:

Name,E-Mail Address User Test,30TestU@example.com User Example,40ExampleU@example.com 姓名、电子邮件地址 用户测试,30TestU@example.com 用户示例,40ExampleU@example.com 我需要合并或创建一个新的CSV,将第一个CSV中的“姓名”列与第二个CSV中的“姓名”列相匹配,然后添加另一个带有匹配用户电子邮件地址的列。我不需要保留第二个CSV中的名称

例如,结果如下所示:

Campus ID,Student ID,Grade,Last Name,First Name,Active 1,50000,12,TEST,USER,1 1,600000,12,EXAMPLE,USER,1 Campus ID,Student ID,Grade,Last Name,First Name,Active,Email 1,50000,12,TEST,USER,1,30TestU@example.com 1,600000,12,EXAMPLE,USER,1,40ExampleU@example.com 校园ID、学生ID、年级、姓、名、活动、电子邮件 150000,12,测试,用户,1,30TestU@example.com 1600000,12,示例,用户,1,40ExampleU@example.com
我曾在PowerShell中尝试过这一点,并且能够获得额外的列,但由于名称的格式不同,因此匹配名称有点太多了。我不需要PowerShell,如果它工作得更好,我可以使用其他解决方案。

这里有一个解决方案,但我永远不会使用它,因为如果多个用户同名,它只会选择第一个匹配项。一个简单的改变(错误或者中间的名字)就会破坏它

<# Sample One
$one = @"
Campus ID,Student ID,Grade,Last Name,First Name,Active
1,50000,12,TEST,USER,1
1,600000,12,EXAMPLE,USER,1
"@ | ConvertFrom-Csv
#>

$one = Import-Csv SampleOne.csv

<# Sample two
$two = @"
Name,E-Mail Address
User Test,30TestU@example.com
User Example,40ExampleU@example.com
"@ | ConvertFrom-Csv
#>

$two = Import-Csv SampleTwo.csv

$three = $one | ForEach-Object {
    $name = $_."First Name" + " " + $_."Last Name"
    $email = $two | Where-Object { $_.Name -eq $name } | Select-Object -First 1 -ExpandProperty "E-Mail Address"
    $_ | Add-Member -MemberType NoteProperty -Name Email -Value $email -PassThru
}

$three |
Select-Object "Campus ID","Student ID","Grade","Last Name","First Name","Active","Email" |
Export-Csv -Path Out.csv -NoTypeInformation

如果这是一个一次性的过程,我会使用Excel。在工作表1中打开文件1,并创建第二个文件可以键入的名称字段,在工作表2中打开文件2,然后在任何记录较多的工作表中生成组合文件。使用sort和VLOOKUP。然后返回并手动处理所有名字重复的学生。如果你需要这是一个自动化的过程,那么你就完蛋了。名称的唯一性不足以用作键。要继续@BaconBits注释。。。关于重复过程,他是对的。如果这不是一次性的过程,你就有真正的问题了,因为你永远不会得到基于名字的好匹配。有太多的重复姓名、昵称、拼写变化等情况。我会对姓名进行一次性匹配,但我拒绝要求我加入人名数据源并将这些请求发送回绘图板的工作。这是一次性交易。我可以处理副本,没有很多学生。我用过这个,效果很好。只有少数几个无法匹配,但手动匹配它们并不是问题。非常感谢。