Thực hành xử lý dữ liệu bằng cách sử dụng lệnh trên tệp sao kê MTTQVN

Thực hành xử lý dữ liệu bằng cách sử dụng lệnh trên tệp sao kê MTTQVN

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Mọi người đã nghe nói đến Jujutsu - jj - một dạng quản lý phiên bản cho mã nguồn (version control system) chưa? Có vẻ như nó đang nhận được nhiều sự quan tâm.

    Chờ xíu! Chẳng phải git đã quá tốt rồi sao? Thế thì chế ra thằng jj để làm gì nữa? Cũng hơi khó trả lời nhỉ? Mỗi công cụ sinh ra chắc chắn phải cải thiện hoặc khắc phục được nhược điểm của cái trước. Cho nên jj ắt hẳn phải làm được điều gì đó mà git chưa làm được nên mới nổi lên như vậy.

    Thật ra mình đã nghe nói đến jj từ vài tháng trước rồi, nhưng vào đọc thì toàn kiến thức cao siêu. Hoặc là đang mang nặng cái lối suy nghĩ của git vào trong đầu rồi nên chưa lĩnh hội ra được điều gì cả.

    Mình hay có kiểu cái gì đọc lần 1 mà không hiểu thì đọc tiếp lần 2, lần 2 không hiểu thì đọc tiếp lần 3... đến lần thứ n mà vẫn không hiểu thì bỏ. Cơ mà không phải là từ bỏ mà một thời gian sau đó quay lại đọc tiếp. Đến một lúc nào đó khả năng mình sẽ hiểu ra một ít vấn đề, thế mới tài 😆.

    Thì cái jj này có vẻ như nó đang mở ra được tính linh hoạt trong việc "cam kết" mã. Tưởng tượng bạn đang làm việc trên một dự án, đang ở nhánh này, muốn sang nhánh khác để sửa, nhưng mà lại đang viết dở ở nhánh này, thế là phải stash, rồi checkout, rồi commit, rồi merge hoặc rebase lại vào nhánh cũ... nhìn chung quá trình làm việc với git nghiêm ngặt đến mức cứng nhắc, cần nhiều thao tác để giải quyết một vấn đề, chưa kể cái cây commit (commit-tree) nữa thì ôi thôi, khỏi xem cho đỡ nhức mắt. Thế nên ông jj này đang làm cách nào đó để bạn khỏi cần phải quan tâm đến các nhánh luôn, sửa trực tiếp vào commit. Nghe ảo nhỉ 😂.

    Đấy mới lĩnh hội được đến đấy, hy vọng sau n lần đọc lại nữa mình sẽ viết được một bài chi tiết hơn về công cụ này.

    » Xem thêm
  • Gòi gòi tới công chiện gòi 🤤🤤🤤

    » Xem thêm
  • Không biết blog được dẫn nguồn từ trang cà phê nào hay sao mà vài ba hôm trở lại đây thấy nhiều người tìm kiếm cà phê thế không biết 🤔.

    Tìm cả cách pha với tìm cả loại hạt, khổ nỗi họ tìm lại không ra bài viết nào vì mình chưa có viết đến mấy trường hợp đó. Phải chăng là ý trời 😀🙏

    » Xem thêm

Vấn đề

Mới đây Ủy ban Trung ương Mặt trận Tổ quốc Việt Nam (MTTQVN) đã đăng tải 12.028 trang sao kê tiền ủng hộ đồng bào bị ảnh hưởng do bão số 3. Ngay sau đó là nhiều cuộc thảo luận sôi nổi xoay quanh chủ đề này trên nổ ra trên mạng xã hội. Và nhanh như chớp, đã có nhiều người làm ra các trang web tra cứu thông tin sao kê. Chỉ cần nhập bất cứ nội dung nào vào ô tìm kiếm, bấm nút, đợi một lát thì dữ liệu tìm thấy sẽ được hiển thị lên màn hình.

Như chúng ta đã biết, tệp tin sao kê của MTTQVN ở định dạng pdf cho nên ắt hẳn máy chủ của các trang web truy xuất đã qua một bước tiền xử lý dữ liệu. Cách dễ nhất mà tôi có thể nghĩ ra được là bóc tách dữ liệu thành các dòng văn bản, nội dung có cấu trúc, đưa vào một loại cơ sở dữ liệu nào đó như SQL rồi sử dụng các câu lệnh truy vấn để tìm kiếm. Thế là bài toán đã có lời giải.

Sau khi thử nghiệm tìm kiếm trên một trang web tra cứu thông tin sao kê. Có vẻ như lượng người truy cập thời điểm đó đang rất đông nên máy chủ liên tục bị báo lỗi 500. Hmm, với một người yêu thích tốc độ thì đây quả là một trải nghiệm tồi. Tự nhiên lúc đó trong đầu tôi nảy ra một ý tưởng: Mình sẽ tự làm một công cụ tìm kiếm dữ liệu ngay trên chiếc máy tính này, chẳng phải sẽ nhanh và chính xác hơn hay sao!

Nghĩ là làm, tôi lên mạng tìm kiếm tệp sao kê. Nó được lưu trữ trên Google Drive. Hớn hở bấm tải xuống thì thật oái oăm làm sao khi Google cảnh báo tệp này đã được tải xuống quá nhiều, khả năng cao phải chờ trong vòng 24h giờ nữa thì mới có thể tải xuống!? Rồi lúc đó liệu khí thế của mình có còn như lúc này nữa để mà làm hay không!!!

Nhưng kiểu gì thì kiểu, chắc chắn đã có người tải được tệp sao kê về rồi, và họ sẽ tải lên đâu đó. Tôi tìm kiếm theo tên của tệp sao kê thì cuối cùng cũng tải nó về được. Nhưng với một tệp pdf thì không dễ để trích xuất thông tin cho nên cần phải chuyển đổi nó sang định dạng khác như csv chẳng hạn. csv là quá hoàn hảo trong nhiều trường hợp xử lý dữ liệu.

Tôi sử dụng một vài công cụ chuyển đổi định dạng trực tuyến nhưng có vẻ nó không được chính xác cho lắm. Đang định viết một đoạn mã để trích xuất thông tin thì lại nghĩ: Chắc là có người làm rồi nên mình có thể không phải mất thời gian làm lại nữa. Quả đúng như vậy, chỉ trong một vài bước tìm kiếm, toidicodedao đã chia sẻ tệp csv sao kê này trong một bài đăng trên Facebook. Gửi một lời cảm ơn sâu sắc rồi nhanh chóng tải nó xuống.

Được rồi, dữ liệu đã có đầy đủ. Từ bây giờ hãy bắt đầu quá trình khám phá dữ liệu với tôi. Nhưng không phải là đưa chúng vào cơ sở dữ liệu rồi thực hiện các câu lệnh tìm kiếm nữa, mà có một cách nhanh và dễ dàng hơn là tận dụng sức mạnh của những dòng lệnh trong Linux.

Nhưng trước tiên, tôi hy vọng rằng bạn đọc đã biết một số công cụ dòng lệnh hữu ích trong Linux như cat, grep, head, tail, sort... cùng một số lệnh nâng cao khác như sedawk. Cũng chẳng cần phải biết cách sử dụng đâu mà chỉ cần biết nó dùng để làm gì là được rồi. Vì sau đó nếu thấy thích, bạn sẽ tự biết cách để học cách sử dụng chúng.

Thực hành

Đầu tiên hãy thử tìm kiếm giao dịch theo tên của một ai đó, tệp tin tải về trước đó có tên là transactions.csv. Ở đây tôi thử tìm kiếm với cái tên "tran thi thuy linh". Cách đơn giản nhất là sử dụng cat kèm grep.

$ cat transactions.csv | grep "tran thi thuy linh"

Không có kết quả nào được tìm thấy, đơn giản vì grep đang phân biệt hoa/thường. Để không phân biệt khi tìm kiếm, thêm một cờ i sau grep:

$ cat transactions.csv | grep -i "tran thi thuy linh"

Tuy vậy đây chưa phải là cách tốt nhất, thay vào đó hãy dùng trực tiếp grep.

$ grep -i "tran thi thuy linh" transactions.csv

grep sao kê

Tiếp theo đếm xem có bao nhiêu dòng sao kê:

$ awk '{count++} END {print count}' transactions.csv

Tuy nhiên số dòng trên là đang bao gồm cả dòng tiêu đề của csv, nên trừ đi 1 thì sẽ ra con số thực tế về số lượng giao dịch. Còn không thì hoàn toàn có thể xử lý bằng lệnh.

$ awk 'NR > 1 {count++} END {print count}' transactions.csv

awk là lệnh tổng hợp dữ liệu rất mạnh mẽ. Có thể coi nó như là một ngôn ngữ lập trình cho dữ liệu. Vì bạn có thể viết logic bên trong awk để thực hiện điều mà mình muốn.

Đếm tổng số tiền đã quyên góp được:

$ awk -F, 'NR > 1 {sum += $2} END {print sum}' transactions.csv

Đếm tổng số tiền ủng hộ được trong ngày 10/09/2024:

$ grep "10/09/2024" transactions.csv | awk -F, '{sum += $2} END {print sum}'

Một trong những điểm mình yêu thích ở các lệnh trong Linux là tính "pipe line", nghĩa là đầu ra của lệnh này sẽ thành đầu vào của lệnh khác. Sắp xếp, kết nối các lệnh lại với nhau sẽ tạo ra được quá trình xử lý xuyên xuốt.

Sắp xếp lại danh sách giao dịch theo số tiền giảm dần, nhưng chỉ trả về 100 dòng đầu tiên cho dễ quan sát.

$ sort -t, -k2 -nr transactions.csv | head -n 100

Đảo ngược kết quả.

$ sort -t, -k2 -n transactions.csv | head -n 100

Chèn thêm một cột số thứ tự vào nội dung sao kê.

$ awk 'NR==1 {print "\"STT\"," $0} NR>1 {print NR-1 "," $0}' transactions.csv | head -n10

Chèn thêm một cột số tài khoản ở cuối, số tài khoản của người chuyển khoản được trích xuất trong nội dung chuyển khoản (nếu có).

$ awk -F, '
BEGIN {OFS=","}
NR==1 {print "STT," $0 ",\"STK\""; next}
{
    match($3, /tu ([0-9]{7,})/, m)
    account_number = (RSTART > 0) ? m[1] : ""
    print NR-1, $0, account_number
}' transactions.csv

Và còn nhiều ví dụ khác nữa. Hãy đọc tài liệu hoặc nhờ ChatGPT viết lệnh cho mong muốn của bạn.

Trên đây là một số ví dụ mà mình đã dùng để truy xuất một vài thông tin để thoả mãn tính tò mò. Đặc biệt muốn nhấn mạnh vào sức mạnh của các câu lệnh xử lý dữ liệu trong Linux. Chúng ta có thể kết hợp các lệnh đó lại với nhau để tìm kiếm thông tin mà mình mong muốn.

Cao cấp
Hello

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...
Bấm hoặc cuộn mạnh để sang bài mới