在以下情况下,我需要将字符串分成多个列。我打算将其导出到.csv,这是我的代码的一部分可以工作的地方,我只需要帮助将以下内容分成几列即可。
有时会有名字,有时没有,如果没有,我希望将其留空。请问我该如何编码才能得到结果?
我要做的主要事情之一是10位数字ID,它应该始终是10位数字。
字符串:
所需结果:
代码当前存在问题:
由于设置了$ Results变量中的拆分方式,因此名称“john”出现在personID列中。我目前在变量中没有名字列,但这就是我要添加的内容。由于10位数字之前有两个破折号,因此我不确定该怎么做。
#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 }
})
谢谢您的帮助。 最佳答案
我建议将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