带有csv文件的PowerShell Regex

问题描述

我目前正在尝试匹配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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...