4

大きな CSV ファイルを並べ替えようとしています。問題は、Combined と呼ばれる列で sort-oject を使用する場合です。期待どおりに並べ替えられません。テストのために、ソートされていないデータをすべて削除し、行数も減らしました。

元の CSV:

Combined
1A THE BIG
7
3A SPRING
19
LUZREN
21
23
25
29
1 HONEY
5
3 THE GOOD
11
ARVALA
BRASAID
13
MEADOWCLAW

パワーシェル:

Import-Csv orginal.csv -delimiter ',' | Sort-Object -Unique Combined 

Combined
--------
1 HONEY
11
13
19
1A THE BIG
21
23
25
29
3 THE GOOD
3A SPRING
5
7
ARVALA
BRASAID
LUZREN
MEADOWCLAW

私が期待したのはこれでした:

Combined
1A THE BIG
5
7
11
13
19
21
23
25
29
1 HONEY
3 THE GOOD
3A SPRING
ARVALA
BRASAID
LUZREN
MEADOWCLAW

完璧な世界では、私はこれが欲しいです:

Combined
1A THE BIG
1 HONEY
3 THE GOOD
3A SPRING
5
7
11
13
19
21
23
25
29
ARVALA
BRASAID
LUZREN
MEADOWCLAW

なぜこれが起こっているのか誰か説明してください。私は1週間モニターに頭をぶつけています。また、どうすれば希望する出力を得ることができますか?

よろしくお願いします!

4

3 に答える 3

4

並べ替えロジックを理解しているかどうかはわかりませんが、次のことを試してください。

$StartsWithNumber = { if ($_.Combined -match '^\d*\D' ) { $_.Combined } }
$IsNumber = { if ($_.Combined -match '^\d*$') { [int]$_.Combined } }
$OnlyLetters = { if ($_.Combined -imatch '^[a-z ]*$') { $_.Combined } }

Import-Csv original.csv | 
Sort-Object $OnlyLetters, $IsNumber, $StartsWithNumber -Unique

Combined
--------
1 HONEY
1A THE BIG
3 THE GOOD
3A SPRING
5
7
11
13
19
21
23
25
29
ARVALA
BRASAID
LUZREN
MEADOWCLAW
于 2013-03-01T14:13:17.023 に答える
1

これを試してください:(完璧な世界ではありません)

Import-Csv original.csv -delimiter ',' | 
Sort-Object { [int]([regex]::Replace( $_.combined , "\D" , "" )) } ,  `
{ [regex]::Replace( $_.combined , "\d" , "" ) } -unique

Combined
--------
ARVALA
BRASAID
LUZREN
MEADOWCLAW
1 HONEY
1A THE BIG
3 THE GOOD
3A SPRING
5
7
11
13
19
21
23
25
29

@Aryadev の素敵な答えに続いて、このコードソートも複数の数字で始まる値:

$allToNumbers = { [int]([regex]::Replace( $_.combined , "\D" , "" )) }
$StartsWithNumber = { if ($_.Combined -match '^\d+\D') { $_.Combined } }
$IsNumber = { if ($_.Combined -match '^\d*$') { [int]$_.Combined } }
$OnlyLetters = { if ($_.Combined -imatch '^[a-z ]*$') { $_.Combined } }

Import-Csv original.csv | 
Sort-Object  $OnlyLetters, $allnumbers, $IsNumber,  $StartsWithNumber -Unique
于 2013-03-01T13:22:19.387 に答える
0

Import-CSVデフォルトですべての値をインポートstringします。だからこそ、目に見える結果が得られるのです。アルファベット順に並べています。英数字の「優先度」は、スペース、数字、文字です。

本格的なコードがなければ、必要な出力を得ることができないと思います。私の唯一の提案は、純粋な数値を int に解析することです。数字の 30 は 5 の後に来ます。これは次の行で実行できます。

$intvalue = 10000
import-csv .\test.csv | % {
    if ([int]::TryParse($_.Combined, [ref]$intvalue)) {
        $_.Combined = $intvalue
    }
    $_
} | Sort-Object -Unique Combined

Combined
--------
1 HONEY
5
7
11
13
19
1A THE BIG
21
23
25
29
3 THE GOOD
3A SPRING
ARVALA
BRASAID
LUZREN 
MEADOWCLAW 
于 2013-03-01T13:16:18.687 に答える