Tìm hiểu về Power Query / M Language (Part 9): Kiểu dữ liệu – List, Record

Có thể có xu hướng bỏ qua việc tìm hiểu về list, record để tìm hiểu trực tiếp về table (bảng), xét cho cùng đối với các kiểu giữ giá trị khác chúng ta chủ yếu làm việc với table. Dữ liệu của bảng được tạo thành từ các giá trị đơn giản. Tuy nhiên, list (danh sách) và record (bản ghi) có thể giống như những kiểu bạn thường không sử dụng, vậy tại sao không bỏ qua chúng?

Hóa ra, một bảng hoạt động theo những cách giống như cả một danh sách và một bản ghi. Nếu bạn muốn tận dụng tất cả những gì mà bảng cung cấp, việc tìm hiểu về những kiểu này là cơ sở. Bên cạnh đó, khi bạn làm việc với M, bạn có thể thấy danh sách và bản ghi hữu ích hơn theo đúng nghĩa của chúng hơn bạn nghĩ.

Danh sách ( list )

Kiểu danh sách lưu trữ chính xác những gì tên của nó ngụ ý: một danh sách các giá trị.

{ 1, 2, 5, 10 }
{ "hello", "dataMaker" }

hoặc một danh sách có thể trống

{ }

Ngoài ra, giá trị của danh sách không cần phải cùng một kiểu dự liệu

{ "hello", 1, 3, true, #date(2021, 9, 9) }

Một danh sách có thể chứa các giá trị và bản thân một danh sách là một giá trị, một danh sách có thể chứa các danh sách, v.v.

{ { "first name", "last name", "children" }, { "ICT", "24h", { "dataMaker", "TechPioneer" } } }

Nếu bạn quan tâm đến danh sách các số nguyên tuần tự tăng dần, .. (2 dấu chấm) là một phím tắt tiện dụng, giúp bạn không cần phải nhập toàn bộ danh sách theo đúng nghĩa.

{ 1..5 } // tương đương với { 1, 2, 3, 4, 5 }
{ -2..0 } // tương đương với  { -2, -1, 0 }
{1, 3, 6..8, 20} // tương đương với  {1 , 3, 6, 7, 8, 20 }

Chỉ hoạt động để tạo danh sách các giá trị tăng dần. Cố gắng sử dụng nó để tạo ra một chuỗi đếm ngược sẽ cho bạn một danh sách trống.

{ 5..1 } // { } -- kết quả là một danh sách trống

Nhiều danh sách có thể được nối bằng cách sử dụng toán tử kết hợp (&).

{ 1, 2 } & {3, 4 } // Kết quả { 1, 2, 3, 4 }
{ 1, 2 } & { 2, 3} // Kết quả { 1, 2, 2, 3 }

Hai danh sách bằng nhau nếu chúng chứa các giá trị giống nhau theo cùng một thứ tự.

{ 1, 2 } = { 1, 2} // true
{ 1, 2 } = { 1, 2, 3} // false
{ 4, 5 } = { 5, 4 } // false -- cùng giá trị nhưng khác thứ tự vị trí
{ 2, 4 } = { 2, 4 } // true
{ 2, 4 } <> { 2, 4 } // false

So sánh lớn hơn (>) và nhỏ hơn (<) không được hỗ trợ với kiểu danh sách.

Truy cập các mục giá trị trong một danh sách

Các mục (item) trong danh sách có thể được truy cập bằng toán tử chỉ mục vị trí (index). Chỉ cần tham chiếu đến danh sách quan tâm và thêm chỉ mục của danh sách mong muốn được bao quanh bởi dấu ngoặc nhọn { }: Tenlist{itemIndex}.

Trong M, chỉ mục danh sách (hoặc chỉ số) dựa trên 0, có nghĩa là mục danh sách đầu tiên ở chỉ mục 0, mục thứ hai ở chỉ mục 1, v.v. Vì vậy, để truy cập mục đầu tiên, hãy sử dụng chỉ mục bằng không 0.

Giả sử MyList = {10, 20, 30}, các biểu thức sau tạo ra kết quả:

MyList{0} // 10 -- giá trị đầu tiên trong danh sách
MyList{1} // 20 -- giá trị thứ hai trong danh sách
MyList{2} // 30 -- giá trị thứ ba trong danh sách

Nếu cố gắng truy cập vào chỉ mục lớn hơn chỉ mục trong danh sách, thì lỗi sẽ được trả về.

MyList{3} // Expression.Error - Không có đủ phần tử trong bảng liệt kê để hoàn thành thao tác. 

Thay vào đó, nếu bạn muốn nhận được giá trị rỗng khi sử dụng một chỉ mục quá lớn, hãy thêm một ? (dấu hỏi) sau dấu ngoặc nhọn.

MyList{3}? // null

Đánh giá lười biếng ( Lazy code)

Danh sách được đánh giá một cách lười biếng. Danh sách dưới đây không tạo ra lỗi, mặc dù giá trị của một mục trong đó được xác định là một biểu thức gây ra lỗi.

let
  ListData = { 1, 2, error "help", 10, 20 }
in
  List.Count(ListData) // 5

Như ví dụ trên, tất cả những gì tôi cần đó là kiểm tra trong danh sách có bao nhiêu item, và M đã trả về kết quả nhưng chúng có hợp lệ hay không lại là một vấn đề khác. Sự lười biếng của M có nghĩa là nó chỉ đánh giá càng nhiều mục danh sách càng cần thiết để tạo ra đầu ra được yêu cầu.

Sử dụng Dữ liệu từ ví dụ trên, các biểu thức sau không phát sinh lỗi. Không cần giá trị của chỉ mục 2

List.Sum(List.FirstN(ListData, 2)) // 3 -- chỉ tính tổng hai mục đầu tiên
List.Sum(List.LastN(ListData, 2)) // 30 -- chỉ tổng hợp hai mục cuối cùng

Thư viện hàm hỗ trợ

Thư viện tiêu chuẩn bao gồm một số phương pháp để làm việc với danh sách. Chúng bao gồm các nhiệm vụ từ đếm mục (count) đến tìm kiếm văn bản, từ tính toán trên danh sách (tổng ‘sum’, tích ‘product’, v.v.) đến chuyển đổi danh sách (ví dụ: xóa mục ‘remove items’, thay thế mục ‘replace items’, đảo ngược ‘reverse’, v.v.), từ việc tạo thống kê (ví dụ: trung bình ‘average’, tối đa ‘max’ , độ lệch chuẩn ‘standard deviation’) để kiểm tra thành viên (như “nó có chứa giá trị này không?” hoặc “tất cả các giá trị trong danh sách có khiến hàm đã cung cấp trả về true không?”), cũng như hỗ trợ các hoạt động tập hợp (liên hợp ‘union’, giao nhau ‘intersect’, khác biệt ‘difference’, kết hợp ‘zip’) và sắp xếp ‘sort’. Thậm chí còn có một nhóm hàm để tạo danh sách các giá trị thuộc các loại khác (giả sử, nếu bạn muốn có một danh sách tuần tự các ngày hoặc khoảng thời gian hoặc có thể là một danh sách các số ngẫu nhiên, v.v.).

Leave a Reply

Your email address will not be published. Required fields are marked *