其實UiPath自帶的Filter DataTable活動可以滿足多數情況下的數據篩選,如果你感興趣的話也可以學習一下通過DataTable的Select()方法實現。
p.s.貌似Select()方法可能對RE Framework的考試有點用處~
先簡單介紹一下DataTable的Select()方法,不知道DataTable是啥的小伙伴請重修UiPath Level 1的相關課程。
DataTable.Select()方法
根據參數指定的篩選條件,對DataTable的數據行進行篩選,返回符合條件的所有行。
- 返回值的類型是一個DataRow的數組(顯示在UiPath里就是DataRow[])。
語法:Select(filterExpression[, sort])
參數:1) filterExpression:必選參數,用來表示篩選條件,類型是字符串(String)。
2) sort:可選參數,用來指定返回結果的排序方式,類型也是字符串。sort不太常用這里就不介紹了,感興趣的小伙伴可以自己查~
我們來看一個實例。假如有一個Excel表格如下(第一列訂單編號,第二列商品名稱,第三列數量)。
我們的需求是用UiPath找出同時符合下列條件的行:
- Order ID = 11003
- Quantity >= 50
- Product Name = DLL1001或ASL1003
開始做!首先是前置工作。
- 用Read Range活動讀取Excel的數據,存放在一個DataTable變量里,這個變量叫order_Dt。
- 還需要創建一個DataRow的數組用來存放Select()的結果,這個變量叫result_Rows。
現在我們使用Select()篩選。拖一個Assign活動,左邊填入剛才創建的變量result_Rows,右邊的寫法如下:
order_Dt.Select("[Order ID] = '11003' AND [Quantity] >= 50 AND [Product Name] IN('DLL1001', 'ASL1003')")
我們一部分一部分看:
- order_Dt.Select():要篩選的DataTable即order_Dt,寫在Select()前面,中間用點連接。
- order_Dt.Select("......"):Select()括號里面的整個條件都需要用雙引號括起來,因為參數filterExpression是個字符串,引用字符串必須用雙引號。
- [Order ID] = '11003':對於filterExpression參數里的條件表達式,列名要用中括號括起,值如果是字符串的話用單引號括起。
- [Order ID] = '11003' AND [Quantity] >= 50:多個條件表達式可以用邏輯運算符AND、OR連接。
- [Product Name] IN('DLL1001', 'ASL1003'):如果條件為一個列表,可以用IN關鍵字表示,即[col name] IN(Value1, Value2, Value3...)。
以上。
有時候可能需要在篩選條件里引入一些變量,讓篩選變成動態的,這個Select()也可以實現。
我們來看看怎么把“Product Name = DLL1001或ASL1003”這個條件用變量表示。
- 首先創建一個字符串數組String[],變量名為arr_ProdName。用Assign賦值,arr_ProdName = {"'DLL1001'", "'ASL1003'"}。
- 注意:字符串用雙引號括起來,雙引號內部還有一層單引號,[雙引號][單引號]字符串[單引號][雙引號]。
- 這里的單引號是字符串的一部分,因為Select()的條件表達式里,字符串需要用單引號括起來。如果是數值的話就不需要單引號和雙引號了。
- 然后再創建一個字符串變量(不是數組),變量名為str_Criteria。用Assign賦值str_Criteria = String.Join(",", arr_ProdName)
- String.Join()方法可以把一個數組的所有元素連接成一個字符串,它的第一個參數是連接符(注意要用雙引號括起來),第二個參數是要連接的數組。
- 此例中連接符是逗號,連接的數組是arr_ProdName,這個數組里有兩個元素,'DLL1001'和'ASL1003'(單引號不是為了引用字符串加上的,單引號本身就是字符串的一部分)。
- 最后的連接結果就是'DLL1001','ASL1003'這樣一個字符串。實際上,上面這些操作都是為了獲得符合Select()要求的條件格式。
- 最后的Select()的寫法改為:order_Dt.Select("[Order ID] = '11003' AND [Quantity] >= 20 OR [Product Name] IN (" + str_Criteria + ")")。
- 就和平時用變量替換一部分字符串的寫法是一樣一樣的,用+號連接左右兩邊的字符串。
這就是Select()方法的一些基本用法了,看上去麻煩可能是因為我寫的太羅嗦,用個一兩遍你就會了。
還有最后一個問題,最后得到了一個DataRow[],怎么去用它呢?
你當然可以像處理其他數組一樣去循環這個DataRow數組,但如果你想把它變成DataTable可以嗎?
可以的。
假如我們要把篩選后的DataRow數組變量result_Rows賦值給一個DataTable變量result_Dt。
使用Assign賦值,result_Dt = result_Rows.CopyToDataTable。
- 務必在賦值前加一個判斷,result_Rows.Count > 0。因為如果最后的篩選結果為空,也就是數組里一個row也沒有,此時賦值給DataTable變量時會拋出異常。
- 如果你的Assign出現了編譯錯誤,就是Assign活動的右邊出現了藍色小嘆號,錯誤提示大意是說你不能對一個DataRow的Array使用CopyToDatatable方法。此時你可能需要手動修改一下你的xaml文件,以解決這個問題。
- 關閉UiPath,找到你剛才編輯的那個程序,它是個后綴為.xaml的文件。
- 右鍵這個xaml文件,用記事本打開它,也可以用Notepad++,VS Code之類的代碼編輯器打開。
- 打開后就是這個程序的源代碼,你需要找到長下面這個樣子的部分,並加上一句:<AssemblyReference>System.Data.DataSetExtensions</AssemblyReference>
- 保存文件,退出。重新打開,應該就不會存在那個編譯錯誤了。
以上內容供大家一起學習研究。我只是個小菜雞,如果有寫的不對的地方,歡迎大家友好指正。
相關內容出處:
http://www.surfandperf.com/2019/05/uipath-how-to-filter-multiple-dynamic.html
https://forum.uipath.com/t/datatable-select/22419
https://forum.uipath.com/t/how-to-filter-data-table-with-variable/29539
https://forum.uipath.com/t/how-to-convert-a-system-data-datarow-in-a-datatable/19946