在以下情况下,我需要将字符串分成多个列。我打算将其导出到.csv文件中,该部分文件可以正常工作。我只需要帮助,请将以下内容分成几列即可。
有时会有名字,有时没有名字,没有名字的时候,我希望它是空白。请问我该如何编码才能得到结果?
我要做的主要事情之一是10位数字ID,应该始终是10位数字。
字符串:
所需结果:
当前的代码问题:
由于设置了$ 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 }
})
谢谢您的帮助。
答案 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