データテーブル内のレコードを自然順に並べ替えたい

お世話になっております。

データテーブル内のレコードについて1点、ご質問させてください。

ファイル名のほかいくつか項目を持ったデータテーブルの
レコードをファイル名で昇順でソートをかけても(データテーブルを並び替えアクティビティにてファイル名昇順で並び替え)
エクスプローラと同じ並び順とならず困っております。

この原因がエクスプローラと同じ「自然順」ではないためであるということは
調べがついたのですが、UiPathにて自然順に並べるには
どのように実装を行ったらよいでしょうか。

お手数をおかけいたしますが、どうか知恵を貸してください。
よろしくお願いいたします。

こんにちは

エクスプローラーと全く同じ挙動を実現するにはそれなりに実装や他のライブラリが必要になると思います。
もし特定の条件下での並べ替えだけでよければ、その仕様を共有いただけると、それ用の式は書けるかもしれません。

2 Likes

自然順とは下記のことですよね。

エクスプローラのファイル順のように、自然順ソートで並び替える

ライブラリやクラス実装が必要なのですが、昼休みに実験として「それっぽい」のをInvokeCodeだけで実装してみました。

参考までに。うまく動かなかったらごめんなさい

'// Argument
' aryIO

'// Function
Dim PartCompare As Func(Of String, String, Integer) = 
	Function(left As String, right As String) As Integer
		Dim x, y As Integer
		If Not(Integer.TryParse(left, x)) Then
			Return left.CompareTo(right)
		ElseIf Not(Integer.TryParse(right, y)) Then
			Return left.CompareTo(right)
		End If
		Return x.CompareTo(y)
	End Function

Dim NaturalCompare As Func(Of String, String, Integer) = 
	Function(x As String, y As String) As Integer
		Dim table As New System.Collections.Generic.Dictionary(Of String, String())
		 If x = y Then
			 Return 0
		 End If
		 Dim x1, y1 As String()
		 If Not(table.TryGetValue(x, x1)) Then
		 	x1 = System.Text.RegularExpressions.Regex.Split(x.Replace(" ", ""), "([0-9]+)")
		 	table.Add(x, x1)
	 	End If
		 If Not(table.TryGetValue(y, y1)) Then
		 	y1 = System.Text.RegularExpressions.Regex.Split(y.Replace(" ", ""), "([0-9]+)")
		 	table.Add(y, y1)
	 	End If

		Dim i As Integer = 0
			While i < x1.Length AndAlso i < y1.Length
				 If x1(i) <> y1(i) Then
					 Return PartCompare(x1(i), y1(i))
				 End If
        	i += 1
    	End While
			
		If y1.Length > x1.Length Then
            Return 1
        Else If x1.Length > y1.Length Then
            Return -1
        Else
            Return 0
        End If
		Return 0
	End Function

'// Main
For idxA As Integer = 0 To UBound(aryIO) -1
	For idxB As Integer = idxA + 1 To UBound(aryIO)
		If NaturalCompare(aryIO(idxA), aryIO(idxB)) > 0 Then
			Dim wrk As String = aryIO(idxB)
			aryIO(idxB) = aryIO(idxA)
			aryIO(idxA) = wrk
		End If
	Next
Next

実装例のフローはこちらです。

topic-337732.xaml (11.3 KB)

1 Like

皆様

お世話になっております。
大変恐縮なのですが、
以下の内容を参考に実装を行ったところ、無事に解決いたしました。

解決に尽力いただきましてありがとうございました。
またわからないことが出た際にはご質問させてください。

2 Likes

shinjiさん

おっしゃる通りです。
私もそのサイトは見つけたのですが、UiPathにて利用する際にうまく落とし込むことができず
頭を抱えておりました。

コードのご提示をいただきましてありがとうございます!
勉強になります。

1 Like

Yoichiさん

コメントいただきましてありがとうございます。

返信が遅くなりましたが、無事に解決いたしました。
また何かございましたらご質問させてください。

よろしくお願いいたします。

2 Likes

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.