使用Powershell替换csv中的值

时间:2018-08-11 22:46:56

标签: powershell

我需要用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

2 个答案:

答案 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方法之间的区别

https://www.powershellmagazine.com/2012/11/12/pstip-a-difference-between-the-replace-operator-and-string-replace-method/

(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 ")

Using Regex in Powershell to grab email