我需要用email.csv中的电子邮件地址覆盖userinfo.csv中的电子邮件值 userid和u_user值在两个csv中都匹配且唯一。 userinfo.csv中的电子邮件地址值不好,需要用email.csv中的电子邮件值覆盖。
如何在csv中匹配用户ID并附加电子邮件值?
不知道从哪里开始。请帮忙。
email.csv
userid,email
1234,user4@email.com
1235,user5@email.com
userinfo.csv
u_work,u_user,u_address,u_city,u_state,u_zip,u_email,u_phonehome
1234,here,there,everywhere,55555,1234@bad.org,555-555-5555
away,1235,there,here,everywhere,66666,1235@bad.com,666-666-6666
new.csv
u_work,u_user,u_address,u_city,u_state,u_zip,u_email,u_phonehome
1234,here,there,everywhere,55555,user4@email.com,555-555-5555
away,1235,there,here,everywhere,66666,user5@email.com,666-666-6666
答案 0 :(得分:2)
您显示的CSV无效。标题行有8个字段。第1行有7个字段。那是无效的。我假设它应该像这样:
userinfo.csv
u_work,u_user,u_address,u_city,u_state,u_zip,u_email,u_phone
home,1234,here,there,everywhere,55555,1234@bad.org,555-555-5555
away,1235,there,here,everywhere,66666,1235@bad.com,666-666-6666
换句话说,在您的示例中,u_phonehome
实际上是u_phone
,而home
在错误的行上。
您的基本步骤是:
A。将email.csv
导入哈希表以快速查找。
$emails = @{}
Import-Csv email.csv | ForEach-Object {
$email[$_.userid] = $_.email
}
B。导入userinfo.csv
,并在必要时替换电子邮件地址。
$NewCSV = Import-Csv userinfo.csv | ForEach-Object {
if ($emails.ContainsKey($_.u_user)) {
$_.u_email = $emails[$_.u_user]
}
$_
}
C。写入输出文件。
$NewCSV | Export-Csv new.csv -NoTypeInformation
您也可以使用Select-Object
和计算出的属性来执行步骤B,但这写起来有点容易。
答案 1 :(得分:0)
您将使用正则表达式进行匹配,并替换为特定字符串的修改。这是一件很普通的事情,并且有很多关于该主题的文章和帖子。因此,请尝试一下以下资源,如果需要进一步的帮助,请尽力而为。
例如:
Windows PowerShell:编写正则表达式
https://technet.microsoft.com/en-us/library/2007.11.powershell.aspx
Powershell:使用正则表达式的多种方法-Kevin Marquette
https://kevinmarquette.github.io/2017-07-31-Powershell-regex-regular-expression
"Hello. Yes, this is a cat." -replace 'cat','dog'
"Hello. Yes, this is a dog." -replace [regex]::Escape('.'),'!'
("Hello. Yes, this is a dog.").Replace('.','!')
PSTip –replace运算符与String.Replace方法之间的区别
(Get-Content C:\test\test.txt) |
Foreach-Object {$_ -replace "(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b",'<$0>'} |
Set-Content C:\test\test.txt
Powershell Regex find emails and replace email with (<email>)
$txt='<p class=FillText><a name="InternetMail_P3"></a>First.Last@company-name.com</p>'
$re="[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#\$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"
[regex]::MAtch($txt, $re, "IgnoreCase ")