Convert csv sang excel với pandas trên Anaconda

Trong quá trình làm việc, mình rất hay phải thao tác với các file csv, excel, html… vì liên quan đến nhiều các phòng ban và làm việc nhiều với dữ liệu, báo cáo.
Đặc thù hệ thống bên mình sử dụng Oracle, họ đã viết sẵn các thủ tục chỉ có thể xuất ra các file có định dạng là csv và html. Nhưng đối với mọi người thì dùng excel thuận tiện hơn, không chỉ IT mà các phòng khác như kế toán… Thế nên mọi người, trong đó cả mình thường xuyên phải chuyển file csv sang định dạng excel để xử lý.
Để chuyển csv sang excel có nhiều cách:

  • Sử dụng tính năng Load data từ file csv có sẽ trong Excel. Cách này đòi hỏi vài bước để xử lý, nhất là đối với dữ liệu text toàn chữ số dài và Tiếng Việt có dấu.
  • Sử dụng tính năng convert trên mạng, có thể google.

Đa phần mọi người đều phải dùng tính năng của excel vì không thể tùy tiện dùng các tool linh tinh nhất là trên mạng vì tính nhạy cảm của dữ liệu. Thế là mình nghĩ ra việc tự làm tool hoặc script xử lý vấn đề trên cho bản thân. Đơn giản là convert từ csv sang excel.
Ban đầu định dùng .NET vì mình đã triển khai nhiều tool cho công việc. Nhưng hiện mình đang mày mò Machine Learning với Anaconda nên mình nghĩ viết bằng Python xem sao.
Với Python có thư viện pandas xử lý rất tốt về mặt dữ liệu, đặc biệt là dữ liệu với excel và csv. Đối với Anaconda thì pandas là một trong những thư viện mặc định trong đó nên không cần cài đặt gì cả.
Đoạn code rất đơn giản như sau:

import pandas as pd 

data = pd.read_csv("C:/Users/SVPK/Desktop/Extract_warranty_201909.csv",delimiter = ';',prefix = 'T',header = 0)  

# print(data) 

 data.to_excel("C:/Users/SVPK/Desktop/Extract_warranty_201909.xlsx") 

Mình giải thích qua đoạn code trên như sau:
Mục đích sẽ load dữ liệu từ csv lên một biến, sau đó tiến hành ghi nó ra file excel.(Đơn giản vậy thôi)
Các tham số chủ yếu mình đã thử là:

  • delimiter: Mặc định csv nó là dấu ‘,’ nhưng hệ thống mình toàn sử dụng dấu ‘;’ để ngăn cách trong file csv
  • prefix: Đối với file mà không chứ tên cột mà muốn đặt tên cột thì mình để tiền tố này để nó đặt mặc định
  • header: Vì có tên cột với không có tên cột nên thực chất data của mình sẽ bắt đầu từ đâu sẽ do tham số này quyết định.

Từ đây dùng cho mình ok, nhưng nhược điểm khó chuyển cho người khác dùng vì phải cài Anaconda hoặc ít nhất là python và pandas. Nên mình đang nghĩ các cách để dùng như:

  • Tạo 1 thư mục cho mọi người ftp để đẩy file vào. Mình có 1 job quét và xử lý sau đó đưa file kết quả sang 1 thư mục khác để mọi người dùng.
  • Tạo một tính năng trên Tool để mọi người upload lên và tải file kết quả xuống (hoặc nhập email để gửi về)
  • Gửi email đến email của mình. Mình sẽ dùng job trên Pentaho tiến hành tự load email, bóc tách file đính kèm, xử lý và gửi trả lại.

Thôi, tạm thời thế đã, dùng Anaconda để chạy cho riêng mình vậy.

Xóa dấu Tiếng Việt

Trong quá trình làm việc với Oracle trên Toad, mình hay lưu các câu lệnh SQL ra file SQL hoặc biên dịch các package, procedure có chứa các đoạn text có dấu Unicode – cụ thể là Tiếng Việt có dấu. Nhưng mình hay thấy sau khi load file SQL lại lên thì toàn bộ dấu Tiếng Việt bị lỗi, tự nó chuyển sang dấu hỏi. Việc này gây cho mình nhiều lúc bực mình vì bị lỗi hết đoạn text không đọc được, có thể do mình chưa config Toad để có thể phù hợp với Tiếng Việt.

Bình thường mình hay xử lý bằng cách làm thủ công bằng tay chuyển các đoạn text có dấu thành Tiếng Việt không dấu hoặc viết bằng Tiếng Anh. Nhưng như thế là không thuận lợi, mình không thích thế.

Tiện thể mình đang có 1 cái webtool bằng .NET tạo ra các tính năng dành riêng cho mình xử lý các công việc thường ngày. Mình liền xây dựng một tính năng nho nhỏ chuyển 1 đoạn text Tiếng Việt có dấu thành đoạn text Tiếng Việt không dấu.
Tính năng này rất đơn giản, chỉ có 2 ô textbox ở chế độ Multiline và một nút bấm. Nút bấm sẽ tiến hành việc xử lý lấy đoạn text ở textbox 1 tiến hành convert thành không dấu và chuyển sang ô textbox 2.

Mình tách thành một hàm riêng để xử lý như sau:

public static string RemoveUnicode(string text)
         {
             string[] arr1 = new string[] { "á", "à", "ả", "ã", "ạ", "â", "ấ", "ầ", "ẩ", "ẫ", "ậ", "ă", "ắ", "ằ", "ẳ", "ẵ", "ặ",
         "đ",
         "é","è","ẻ","ẽ","ẹ","ê","ế","ề","ể","ễ","ệ",
         "í","ì","ỉ","ĩ","ị",
         "ó","ò","ỏ","õ","ọ","ô","ố","ồ","ổ","ỗ","ộ","ơ","ớ","ờ","ở","ỡ","ợ",
         "ú","ù","ủ","ũ","ụ","ư","ứ","ừ","ử","ữ","ự",
         "ý","ỳ","ỷ","ỹ","ỵ",};
             string[] arr2 = new string[] { "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a",
         "d",
         "e","e","e","e","e","e","e","e","e","e","e",
         "i","i","i","i","i",
         "o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o","o",
         "u","u","u","u","u","u","u","u","u","u","u",
         "y","y","y","y","y",};
             for (int i = 0; i < arr1.Length; i++)
             {
                 text = text.Replace(arr1[i], arr2[i]);
                 text = text.Replace(arr1[i].ToUpper(), arr2[i].ToUpper());
             }
             return text;
         }

Build lên thế là xong. Mình có thể triển khai ở các ngôn ngữ lập trình khác nhau một cách tương tự.

Crawl một trang về thơ ca

Đây sẽ là một dự án làm cho vui. Mình sẽ crawl toàn bộ các bài thơ của trang: http://vanhoc.xitrum.net/thoca/ về đặt lên wordpress xem chơi.

Bắt đầu từ ngày mai nhé 2019-10-11. 😀

Update: 11/10/2019

Đã triển khai việc crawl danh sách các link liên quan đến thơ ca nội bộ của trang. Kết quả code và dữ liệu nằm tại đường dẫn:

  • Code: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/20191011_crawl_link.py
  • Data: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/thoca.csv

Với dữ liệu này bước tiếp theo phải xử lý:

  • Cần làm sạch dữ liệu, chỉ lấy link có dữ liệu là bài thơ mà thôi
  • Tiếp tục crawl dữ liệu nội bộ trang, loại bỏ trùng lặp
  • Dựng local wordpress để đẩy dữ liệu vào

Chia sẻ ghi chú tạm trực tuyến

Tham gia Không gian cộng đồng (một cộng đồng nguồn mở tại Hà Nội) đem rất nhiều điều bổ ích đối với mình. Biết được phong các chia sẻ, nhiều phần mềm, tool, tiện ích rất hay. Ví dụ sau đây là một ứng dụng chia sẻ ghi chú tạm trực tuyến.

Đó là mình đặt tên nó như vậy, nó là một ứng dụng trực tuyến hay đơn giản hơn là một website. Mình biết nó đến đầu tiên đó là https://pastebin.com, tất nhiên còn một số trang khác cũng có tính năng tương tự.

Vậy thì cái này để làm gì? Cái này đơn giản chỉ là note lại để lưu trữ hoặc chia sẻ cho người khác một cách ngắn gọn và nhanh nhất. Ví dụ mình muốn chia sẻ cho một người bạn một đoạn code tầm mấy trăm dòng. Ta có thể gửi thẳng qua Skype hoặc lưu ra file để gửi… Mọi thứ đó phức tạp và làm rối mắt hết. Thay vào đó ta có thể làm nhanh hơn khi dùng pastebin. Ta tạo một note mới copy nội dung đó vào, có thể chọn ngôn ngữ (code) để nhìn cho dễ. Sau đó chỉ việc gửi link đó cho người hoặc nhóm người cần gửi là xong. Link đó rất ngắn gọn ta có thể nhớ và đọc được luôn.

Đi sâu vào thì cái này cũng có nhiều tính năng hay mà đội code hoặc đội nguồn mở muốn dùng. Các tính năng mở rộng hay để quản lý note thì phải đăng nhập hoặc bản trả phí… Không những thế nó còn public API để mọi người có thể sử dụng…

Vì để chia sẻ ngay nên phần này đa phần để public để mọi người xem được, nên có trường hợp một số người chia sẻ cho đồng nghiệp note có chứa mật khẩu vào hệ thống vô tình bị lộ trên Internet gây chấn động. Đôi khi rảnh rỗi một số người như mình lại đi lướt random trên đó xem mọi người đang chia sẻ những gì. 😀

Khởi động app theo đặc quyền

Chuyện là hôm nay đồng nghiệp mình tiến hành thực hiện một số thao tác cập nhật một số file xml trong ứng dụng nhưng không được. Hệ thống báo không có quyền mặc dù việc này bình thường vẫn có thể làm được. Ứng dụng bên mình code bằng Java chạy trên webserver là tomcat. Qua kiểm tra thì thấy gần đây App Tomcat được khởi động lại bằng quyền root. Bình thường thì việc reset App Tomcat chỉ được thực hiện với quyền bình thường (không phải quyền root).

Lý giải điều này là do việc phân quyền trên Linux. Việc cài đặt hay reset app trên Linux với quyền khác nhau là khác nhau trên Linux. Khi reset bằng quyền root thì với các user khác sẽ gặp một số vấn đề về quyền khi truy cập một số file trên đó. Phần này mình chưa rõ lắm nhưng cần note lại để sau tìm hiểu thêm.

Cách khắc phục thì phải stop app Tomcat bằng quyền root và sau đó start bằng quyền vẫn hay sử dụng.

Nhưng trên window thì theo mình thấy không vấn đề gì cả.