Powershell-如何根据各种字符和10位数字拆分字符串?

时间:2020-10-20 18:48:30

标签: regex powershell

在以下情况下,我需要将字符串分成多个列。我打算将其导出到.csv文件中,该部分文件可以正常工作。我只需要帮助,请将以下内容分成几列即可。

有时会有名字,有时没有名字,没有名字的时候,我希望它是空白。请问我该如何编码才能得到结果?

我要做的主要事情之一是10位数字ID,应该始终是10位数字。

字符串:

  • 20201015 \ smith-1234567890-contract_application-20200418_1889
  • 20201015 \ jones-john-0987654321-salary_contract-20200309_1642

所需结果:

enter image description here

当前的代码问题:

由于设置了$ Results变量的拆分方式,所以在personID列中显示了“ john”名称。我目前在变量中没有名字列,但这就是我要添加的内容。由于10位数字前有2个破折号,所以我不确定该怎么做。

#Get the names of the files
$InStuff = @(Get-ChildItem "\\filepath"-Name -Recurse) 
                            
#Split out path into columns
$Results = @(foreach($filepath in $InStuff)
{
  $parts = $filepath -split '-'; 
  [pscustomobject]@{"DateFirst" = $parts[0]; "PersonID" = $parts[1]; "PersonFileType" = $parts[2]; "FilePath"=$filepath }
})

谢谢您的帮助。

2 个答案:

答案 0 :(得分:3)

我建议将switch语句与正则表达式模式匹配并最终拆分名称(仅在需要时才发生)组合使用。虽然这只能处理两个名称,但是根据您的描述,这应该可以正常工作。

$text = @'
20201015\smith-1234567890-contract_application-20200418_1889
20201015\jones-john-0987654321-salary_contract-20200309_1642
'@ -split "`n"

switch -Regex ($text) {
    '^(\d+)\\(.+)-(\d{10})-(.+)-(.+)' {
        $lastname,$firstname = $matches.2 -split '-'
        [pscustomobject]@{
            Date      = $matches.1
            LastName  = $lastname
            FirstName = $firstname
            PersonID  = $matches.3
            FileName  = $matches.4
            DateCode  = $matches.5
        }
    }
}

输出

Date      : 20201015
LastName  : smith
FirstName : 
PersonID  : 1234567890
FileName  : contract_application
DateCode  : 20200418_1889

Date      : 20201015
LastName  : jones
FirstName : john
PersonID  : 0987654321
FileName  : salary_contract
DateCode  : 20200309_1642

您可以将结果直接传递到Export-Csv-这只是一个示例,我确定您还有其他代码将插入此switch语句。

$results = switch -Regex ($text) {
    '^(\d+)\\(.+)-(\d{10})-(.+)-(.+)' {
        $lastname,$firstname = $matches.2 -split '-'
        [pscustomobject]@{
            Date      = $matches.1
            LastName  = $lastname
            FirstName = $firstname
            PersonID  = $matches.3
            FileName  = $matches.4
            DateCode  = $matches.5
        }
    }
}

$results | export-csv c:\temp\exporttest.csv -NoTypeInformation

答案 1 :(得分:2)

您可以使用

^(?<Date>\d+)\\(?<lastName>\w+)(?:-(?<firstName>\w+))?-(?<personID>\d+)-(?<filename>.*)-(?<dateCode>\d+_\d+)$

请参见regex demo详细信息

  • ^-字符串的开头
  • (?<Date>\d+)-一个或多个数字
  • \\-反斜杠
  • (?<lastName>\w+)-一个或多个单词字符
  • (?:-(?<firstName>\w+))?--的可选序列,然后是1个以上的字符char
  • -(?<personID>\d+)--和1个以上数字
  • --连字符
  • (?<filename>.*)-尽可能使用除换行符以外的任意0+个字符
  • --连字符
  • (?<dateCode>\d+_\d+)-1位数以上,_,1位数以上
  • $-字符串的结尾。

Powershell测试:

$rx='^(?<Date>\d+)\\(?<lastName>\w+)(?:-(?<firstName>\w+))?-(?<personID>\d+)-(?<filename>.*)-(?<dateCode>\d+_\d+)$'
$s='20201015\smith-1234567890-contract_application-20200418_1889'
$s -match $rx
$matches

Name                           Value
----                           -----
filename                       contract_application
lastName                       smith
Date                           20201015
dateCode                       20200418_1889
personID                       1234567890
0                              20201015\smith-1234567890-contract_application-20200418_1889
相关问题