问题描述
我目前正在尝试匹配ID模式,并替换为0或1。
example pc0045601234 replace with 1234 the last 4 and add the 3rd digit in front "01234"
我尝试了下面的代码,但是外面只用没有匹配的员工填充了userid列
$reportPath = '.\report.csv'`$reportPath = '.\report.csv'`
$csvPath = '.\output.csv'
$data = Import-Csv -Path $reportPath
$output = @()
foreach ($row in $data) {
$table = "" | Select ID,FirstName,LastName,userid
$table.ID = $row.ID
$table.FirstName = $row.FirstName
$table.LastName = $row.LastName
switch -Wildcard ($row.ID)
{
{$row.ID -match 'P\d\d\d\d\d\D\D\D'} {$table.userid = "Contractor"; continue}
{$row.ID -match 'SEC\d\d\d\D\D\D\D'} {$table.userid = "Contractor"; continue}
{$row.ID.StartsWith("P005700477")} {$table.userid = $row.ID -replace "P005700477","0477"; continue}
{$row.ID.StartsWith("P00570")} {$table.userid = $row.ID -replace "P00570","0"; continue}
default {$table.userid = "No Matching Employee"}
}
$output += $table
}
$output | Export-csv -NoTypeinformation -Path $csvPath
解决方法
以下是获得所需结果的三种不同方法。前两个使用相同的技术,只是编写方式不同。
首先,我们将示例数据作为多行字符串数组放入变量中。这等效于$text = Get-Content $somefile
$text = @'
PC05601234
PC15601234
'@ -split [environment]::NewLine
选项1#转换为字符数组,选择第3位和最后4位数字。
$text | foreach {-join ($_.ToChararray()| select -Skip 2 -First 1 -Last 4)}
选项2#与上述相同,需要额外的-join
以避免空格。
$text | foreach {(-join $_.ToChararray()| foreach{$_[2]+(-join $_[-4..-1])})}
选项3#我的偏好,正则表达式。捕获所需的数字,然后用捕获的这两个值替换整个字符串。
$text -replace '^\D+(?!=\d)(\d)\w+([\d]{4}$)','$1$2'
所有这些输出
01234
11234
使用不同的字符/数字组合和长度进行进一步的测试。
$text = @'
PC05601234
PC15601234
PC0ABC124321
PC1DE4321
PC0A5678
PC1ABCD215678
'@ -split [environment]::NewLine
通过每个选项运行新的样本数据都会产生此输出
01234
11234
04321
14321
05678
15678