學習大綱
- 如何拆分字符串
- 如何改變部分字符串的格式
- 如何在表格中根據條件選中特定的行
1. 標量型變量,集合,表格
活動的屬性都有預定義的數據類型。鼠標懸停在屬性面板的某個屬性上,就會出現相應的提示。
- 使用右鍵菜單或Ctrl+K在屬性欄創建的變量,會直接設置為屬性預定義的類型。
- 標量型變量 (Scalar Variables):一個單獨的固定類型的數據。
- e.g. 字符 (Characters),布爾值,數字,日期和時間
- 集合 (Collections):
- Arrays, Lists, Queues
- 特殊類型 - 字符串 (Strings):字符串可以看作多個字符的集合。
- 特殊類型 - 字典 (Dictionaries):字典包含兩個相互關聯的集合:名稱和值。字典通過名稱而不是索引號來引用值。
- 可以使用字典從Orchestrator隊列中提取數據。
- 表格 (Tables):將數據保存在二維的結構中,通過行和列來索引數據。
詳細解析:
1) Generic Value:字符串型、布爾型、數字型、日期時間型。使用起來靈活方便,支持多種字符串方法。
2) Array和List
- 元素的數量
- Array:固定數量
- List:可以通過添加或刪除元素來增大或縮小
- 定義方式
- Array:在變量面板中選擇數組元素的數據類型。定義默認值的語法為:{"Value1", "Value2"}。
- List:在.NET數據類型中,搜索並選中List<T>,再選擇數據類型。定義默認值的語法為:new List(of String) from {"Value1","Value2"}。必須重申數據類型 (of 數據類型),from加數組的部分可以省略。
- For Each活動:Array和List都適用。使用For Each時,必須把屬性面板中的TypeArgument設置為與Array或List的元素一致的類型。
- 添加刪除元素:僅適用於List。使用Invoke Method活動,在TargetObject中填寫List的變量名,在MethodName中填入Add,在屬性面板中的Parameters屬性里添加新元素,注意Type一定要與List本身的數據類型一致。
3) 字典 (Dictionaries)
- 作用:
- 提取Orchestrator隊列中的數據
- 將多個數據作為單個變量傳遞
- 定義字典:
- 在.NET數據類型中,搜索並選中Dictionary<TKey, TValue>,在選擇Key和Value的數據類型,一般Key是String型,Value是String型或對象。
- 定義默認值:new Dictionary(of String, String) from {{"Key1","Value1"}, {"Key2","Value2"}}
- 添加Key和Value:
-
加入一個Assign活動,等號左邊是字典變量的名稱(Name)和新的關鍵字(Key),等號右邊是新的值(Value)。比如:config("Key3") = "Value3"。
-
2. 文本的拆分
- 文本都要用引號括起來。如果要表示引號本身,需要輸入兩次引號。例如:"David says ""Hello"""顯示為David says "Hello"。
- Split方法:通過分隔符拆分文本,生成一個數組。數組的索引號從0開始。
- 將變量message(message="Operation ended successfully. Record 1234 has been created.") 以空格作為分隔符拆分,寫作message.Split(" "c)。拆分后將得到一個擁有8個元素的數組,如下圖所示:
-
- 將光標停在.Split()的括號中間,同時按下Ctrl+Shift+Space,會顯示Split的更多使用方法和相關的參數信息,上下鍵可以翻頁。
- 分隔符可以是一個字符串,可以不止有一個。message.Split({"Record ", " has"},StringSplitOptions.None)可以得到下圖所示的數組:
-
- 注意:{"Record ", " has"}中,Record的后面和has的前面要加空格。
-
Split方法的第二個參數StringSplittOptions.None指定是否支持空元素。
3. 文本的組合
1) 連接文本:
- 連接字符串型的數據:直接使用加號連接,比如"This " + "that" = "This that"。
- 連接混合類型的數據:先把非字符串型的數據轉換成字符串型,再用加號連接。比如”This “ + myNumber.ToString + Now.ToString = "This 4210/17/2018 16:15:30"
- 改變時間/日期格式:例如Now.ToString("MMMM yyyy") 會顯示為October 2018。
- 更多格式的表達參考
2) String.Format方法:適用於更長的、更復雜的數據組合,並且允許自定義格式。
- String.Format("Hello {0} {1}", myNumber, Now)
- Hello是靜態文本;{0}和{1}是占位符,表示引號右邊的數據在整個字符串中顯示的位置,從0開始索引。
- 更改日期和時間的格式可以寫作:String.Format("Hello {0} {1:MMMM yyyy}", myNumber, Now)
3) 常用的String方法:filePath = "Downloads/{0}/output.txt",itemID = "ASD123"
- GenericValues也可以使用除了EndsWith,StartsWith和Format以外的方法。
- 詳情參考
方法 | 語法示例 | 運行結果 |
Contains | filePath.Contains(".") | True |
EndsWith/StartsWith | filePath.EndsWith(".txt") | True |
Format | String.Format(filePath,itemID) | "Downloads/ASD123/output.txt" |
Replace | filePath.Replace("/","\") | "Downloads\{0}\output.txt" |
Split | filePath.Split("/".ToCharArray) | {"Downloads", "{0}", "output.txt"} |
Substring | filePath.Substring(10) | "{0}\output.txt" |
ToLower/ToUpper | filePath.ToUpper | "DOWNLOADS/{0}/OUTPUT.TXT" |
Trim | random.Trim | "ASD" |
4) Data Tables
常見的數據表格有Excel文件或CSV文件。CSV(Comma-Separated Values,逗號分隔值也稱字符分隔值)文件以純文本形式存儲表格數據。CSV文件由任意數目的記錄組成,記錄間以某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其它字符或字符串,最常見的是逗號或制表符。
- Read CSV活動:將CSV文件中的數據存入DataTable類型的變量中。勾選IncludeColumnNames,表示第一行是列標題。
- Output Data Table活動:將DataTable型數據轉換成字符串型,可以通過Message Box活動或Write Line活動顯示該字符串。適合抓取數據或Debug。
- For Each Row活動:在DataTable的每一行中循環。
- 如果要取得某一列的數據,可以直接指定列標題。例如:在For Each Row活動中,row("Name").ToString將返回該DataTable的Name一列下所有的數據。
- 如果要獲得某一列某一行的數據,還要加上行號,行號從0開始且不計算標題行。例如:sampleData.Rows(0)("Name").ToString。
- 可以指定列的索引號代替列標題,第一列的索引號是0。如果Name是第2列,可以寫作sampleData.Rows(0)(1).ToString
- Select方法:搜索整個DataTable的行,找到符合指定條件的行,並返回一個數組。
- 實例:提取DataTable變量sampleData中年齡小於40且Income大於40k的行。
- 將sampleData.Select("Age<40 and Income>'40k'")賦值給變量filteredRows。filteredRows的數據類型是DataRow[](數組)。
- DataRow[]通過For Each活動循環:Foreach row in filteredRows。注意將TypeArgument的類型改為DataRow(不是數組)。
- 在For Each活動中添加Write Line活動:row("Name").ToString + " " + row("Age").ToString + " " + row("Income").ToString。
- 運行程序會在Output面板中寫入符合條件的行的Name,Age和Income信息。
除了Select方法外,DataTable類型還有很多手寫的方法。
4. 練習:為俱樂部成員設置昵稱
- 要求:為俱樂部成員取一個昵稱,昵稱由名字的前三個字母全大寫和姓氏的前三個字母全小寫組成,如Marcella Knipp的昵稱為MARkni。
- 源文件:CVS文件。第一行是列標題(First, Last, Club Number)。從第二行開始記錄名字、姓氏、是否為俱樂部成員(Yes/No)。
- 思路:
- 添加Read CSV活動:讀取源文件,賦值給一個DataTable類型的變量names。確保IncludeColumnNames屬性是被勾選的狀態。
- 如果需要讀取的文件存放在項目文件夾下,則可以直接輸入文件名,而不需要完整的文件路徑。
- 新建一個變量clubMembers,變量類型選擇Array of [T],元素類型選擇Browse for Types...,搜索DataRow。這樣就創建了一個DataRow的數組。
- 添加Assign活動:To=clubMembers;Value=names.Select("[Club Member]= ‘Yes’ ")
- 如果列標題包含空格,則要使用中括號[ ]將它括起來。
- 文本內容要用單引號''括起來。
- 添加For Each活動:修改為Foreach row in clubMembers,將TypeArgument屬性設置為DataRow。
- 新建三個String型變量,firstName,lastName和nickName。
- 在For Each里添加兩個Assign活動:firstName=row("First").ToString;lastName=row("Last").ToString。
- 生成nickName需要用到:Substring方法提取名和姓的前三個字母;ToUpper方法將前三個字母大寫;ToLower方法將前三個字母小寫;+號連接字符串。
- 在For Each里添加Assign活動:nickName=firstName.Substring(0,3).ToUpper + lastName.Substring(0,3).ToLower。
- Substring(0,3)表示從第一個字符開始(Start Index),提取三個字符(Length)。
- 在For Each里添加Wirte Line活動:Text=nickName。運行后在Output面板中會顯示俱樂部成員的昵稱。
*本課使用過的新活動、方法、函數等:
- Invoke Method
- Read CSV
- Output Data Table
- For Each Row
- .Contains():根據文本中是否包含指定的字符串,返回True或False。
- .Split()
- String.Format()