在两个系统之间的数据同步过程中,由于目标系统中的依赖关系,需要按照特定的顺序处理数据。从源系统检索的数据不按所需顺序排序。
在这种情况下,使用排序对象按字母顺序排序是行不通的:
$a | Sort-Object因此,需要一个正则表达式来提取用于排序的字母和数字。
举例说明数据结构的样本数据:
$a = @('K1 Lorem ipsum','K2-2-2-1 Lorem ipsum','K1-1 Lorem ipsum','K2-7 Lorem ipsum','K1-1-1 Lorem ipsum','K1-4-2-8 Lorem ipsum','K2a Lorem ipsum','K2a-1 Lorem ipsum','K2a-1-1 Lorem ipsum','K2a-1-1-1 Lorem ipsum','K2-2-2-2 Lorem ipsum')
$a | Sort-Object所需产出:
实际产出:
对于创建用于排序目的的自定义对象所需的正则表达式,任何要开始使用的指针都将不胜感激。
更新2019-10-10:
谢谢各位,很抱歉缺少信息。
我在发帖之前试过的内容,但没有包括因为我觉得我走错了方向:
$a = @('K1 Lorem ipsum','K2-2-2-1 Lorem ipsum','K1-1 Lorem ipsum','K2-7 Lorem ipsum','K1-1-1 Lorem ipsum','K1-4-2-8 Lorem ipsum','K2a Lorem ipsum','K2a-1 Lorem ipsum','K2a-1-1 Lorem ipsum','K2a-1-1-1 Lorem ipsum','K2-2-2-2 Lorem ipsum')
Foreach($b in $a){
$null = $b.Name -match '(\D+)(\d+)'
[PSCustomObject]@{
Original = $b.Name
Letters = $Matches[1]
Number1 = [int]$Matches[2]
}
}无论如何,下次我一定要把它包括进去。
这是一个截图来自实际的源结构( Sharepoint )。
所需的输出应该与屏幕截图相同:
PowerShell中相同的列表(随机)
$a = @(
'K2-5c-2b-1 Lorem ipsum'
'K1-1-1 Lorem ipsum'
'K1-4-2-8 Lorem ipsum'
'K2-5b Lorem ipsum'
'K2-7 Lorem ipsum'
'K2a Lorem ipsum'
'K2-5 Lorem ipsum'
'K2-5c-2b Lorem ipsum'
'K1-1 Lorem ipsum'
'K2-5a Lorem ipsum'
'K1 Lorem ipsum'
'K2-5c Lorem ipsum'
'K2-6 Lorem ipsum'
'K2-5c-1 Lorem ipsum'
'K2b-1-1 Lorem ipsum'
'K2-5c-2a Lorem ipsum'
'K2-5c-2b-2 Lorem ipsum'
'K2b Lorem ipsum'
'K2b-1 Lorem ipsum'
'K2b-1-2 Lorem ipsum'
)分类标准:
发布于 2019-10-11 07:17:05
这是痛苦的,因为你需要打破每一个条款,但这
$regex1=[regex]"(?i)^[a-z]+"
$regex2=[regex]"(?i)(?<=^[a-z]+)\d+"
$regex3=[regex]"(?i)(?<=^[a-z]+\d+)[a-z]+"
$regex4=[regex]"(?i)(?<=^[a-z]+\d+[a-z]*-)\d+"
$regex5=[regex]"(?i)(?<=^[a-z]+\d+[a-z]*-\d+)[a-z]+"
$regex6=[regex]"(?i)(?<=^[a-z]+\d+[a-z]*-\d+[a-z]*-)\d+"
$regex7=[regex]"(?i)(?<=^[a-z]+\d+[a-z]*-\d+[a-z]*-\d+)."
$a = @(
'K2-5c-2b-1 Lorem ipsum'
'K1-1-1 Lorem ipsum'
'K1-4-2-8 Lorem ipsum'
'K2-5b Lorem ipsum'
'K2-7 Lorem ipsum'
'K2a Lorem ipsum'
'K2-5 Lorem ipsum'
'K2-5c-2b Lorem ipsum'
'K1-1 Lorem ipsum'
'K7-1 Lorem ipsum'
'K2-5a Lorem ipsum'
'K1 Lorem ipsum'
'K2-5c Lorem ipsum'
'K2-6 Lorem ipsum'
'K2-5c-1 Lorem ipsum'
'K2b-1-1 Lorem ipsum'
'K2-5c-2a Lorem ipsum'
'K2-5c-2b-2 Lorem ipsum'
'K2b Lorem ipsum'
'K2b-1 Lorem ipsum'
'K2b-1-2 Lorem ipsum'
) | sort @{e={$regex1.Match($_).Value}}, @{e={$regex2.Match($_).Value -as [int]} },
@{e={$regex3.Match($_).Value}}, @{e={$regex4.Match($_).Value -as [int]} },
@{e={$regex5.Match($_).Value}}, @{e={$regex6.Match($_).Value -as [int]}} ,
@{e={$regex7.Match($_).Value}}编辑-第一个版本没有as int,因此2位数字不能正确排序,从而产生以下结果
K1 Lorem ipsum
K1-1 Lorem ipsum
K1-1-1 Lorem ipsum
K1-4-2-8 Lorem ipsum
K2-5 Lorem ipsum
K2-5a Lorem ipsum
K2-5b Lorem ipsum
K2-5c Lorem ipsum
K2-5c-1 Lorem ipsum
K2-5c-2a Lorem ipsum
K2-5c-2b-2 Lorem ipsum
K2-5c-2b-1 Lorem ipsum
K2-5c-2b Lorem ipsum
K2-6 Lorem ipsum
K2-7 Lorem ipsum
K2a Lorem ipsum
K2b Lorem ipsum
K2b-1 Lorem ipsum
K2b-1-1 Lorem ipsum
K2b-1-2 Lorem ipsum
K7-1 Lorem ipsum发布于 2019-10-11 06:10:42
所需的输出不遵循给定的规则,特别是规则。
与所需的顺序不兼容。
K2a Lorem ipsum
K2-5 Lorem ipsum
K2-6 Lorem ipsum
K2-7 Lorem ipsum
K2b Lorem ipsum屏幕截图显示数据是在树结构中组织的。显然,这个结构有一个内在的布局,不可能仅仅通过按任何规则进行排序来重建。
发布于 2019-10-11 08:04:34
发了那么长的答案后,我就去刮胡子了。像这样想。“他们不应该使用5a,5b,如果他们使用5-a,5-b,那么它就会把--放在任何地方,后面有一个数字,前面有一个字母。”
sort @{e={$_ -replace "(?<=\d)(?=[a-z])","-"}}它将处理多个字母,但多个数字将被错误地处理,因此
sort @{e={$_ -replace "(?<=\d)(?=[a-z])","-" -replace "(?<=\D)(?=\d\D|\d$)","0"}}做同样的事情,并说,如果你发现一个位置前面有一个非数字,后面跟着一个数字和一个非数字,或者一个数字在字符串的末尾,然后在那个空格中放一个0。如果您有三位数,您可以添加另一个寻找两位数的数字。
-replace "(?<=\D)(?=\d\d\D|\d\d$)","0"https://stackoverflow.com/questions/58322520
复制相似问题