During synchronization of data between two systems, the data needs to be processed in a specific order due to dependencies in the target system. Data retrieved from the source system is not ordered in the needed order.
Using Sort-Object to sort alphabetically won`t work in this case:
$a | Sort-Object
Hence, a regular expression which extracts letters and numbers to use for sorting purposes is needed.
Sample data illustrating the data structure:
$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
Required output:
- K1 Lorem ipsum
- K1-1 Lorem ipsum
- K1-1-1 Lorem ipsum
- K1-4-2-8 Lorem ipsum
- K2-2-2-1 Lorem ipsum
- K2-2-2-2 Lorem ipsum
- K2a Lorem ipsum
- K2a-1 Lorem ipsum
- K2a-1-1 Lorem ipsum
- K2a-1-1-1 Lorem ipsum
- K2-7 Lorem ipsum
Actual output:
- K1 Lorem ipsum
- K1-1 Lorem ipsum
- K1-1-1 Lorem ipsum
- K1-4-2-8 Lorem ipsum
- K2-2-2-1 Lorem ipsum
- K2-2-2-2 Lorem ipsum
- K2-7 Lorem ipsum
- K2a Lorem ipsum
- K2a-1 Lorem ipsum
- K2a-1-1 Lorem ipsum
- K2a-1-1-1 Lorem ipsum
Any pointers to get started with the regular expression needed to create a custom object for sorting purposes would be appreciated.
Update 2019-10-10:
Thanks guys, and sorry for the lack of information.
What I had tried before posting, but did not include as I felt I was going into a wrong direction:
$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]
}
}
I`ll make sure to include it anyway the next time.
Here is a screenshot from the actual source structure (a Sharepoint Term Store).
Required output should be the same as the screenshot:
- K1 Lorem ipsum
- K1-1 Lorem ipsum
- K1-1-1 Lorem ipsum
- K1-4-2-8 Lorem ipsum
- K2a 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 Lorem ipsum
- K2-5c-2b-1 Lorem ipsum
- K2-5c-2b-2 Lorem ipsum
- K2-6 Lorem ipsum
- K2-7 Lorem ipsum
- K2b Lorem ipsum
- K2b-1 Lorem ipsum
- K2b-1-1 Lorem ipsum
- K2b-1-2 Lorem ipsum
The same list in PowerShell (randomized)
$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'
)
The sorting criterias:
- Numbers in tokens (such as K2) should be sorted numerically
- Sort on number followed by letter. For example, K2a should be sorted before K3. Also, K2b should be sorted after K2a, but before K3.
- Depth matters, for example K2a comes before K2-5.
- When on the same depth level, numbers without a following letter should come first. For example, K2-5 comes before K2-5a.