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

Update: 08/11/2019

Lơ là một thời gian mới quay lại triển nốt cái này cho dứt điểm.

Dựng local wordpress để đẩy dữ liệu vào: phần này đơn giản sử dụng phần mêm Xampp, sau đó tải wordpress về cài đặt là xong.

Đầu tiên bóc tách thử dữ liệu của một link

Đầu tiên bóc tách thử dữ liệu của một link thì phát hiện thấy cấu trúc của xitrum viết theo dạng cũ sử dụng bảng. Tạm thời chỉ cần lấy Tiêu đề và nội dung của bài viết. Tiêu đề thì ta chỉ lấy riêng text còn nội dung thì lấy cả cấu trúc HTML (gồm div, thẻ b…). Phần này sử dụng Python với thư viện BeautifulSoup, đáng lưu ý là việc lấy thẻ table với các tham số đặc biệt của table chứa nội dung bài thơ là: {“border”:”0″, “width”:”90%”,”cellpadding”:”3″,”cellspacing”:”0″}
Chi tiết code tại: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/Get_content_from_link.py

Tiếp đến ta sẽ tiến hành đưa dữ liệu vào bảng của wordpress là một bài viết mới. Mỗi một bài viết mới là một dòng dữ liệu trong bảng POSTS. Ta sẽ tiến hành chuẩn bị dữ liệu để insert vào bảng này. Ta cần lưu ý một số điểm:

  • Để kết nối với CSDL và hiển thị tốt Tiếng Việt ta sử dụng mã utf-8 (# –– coding: utf-8 –-) trong file python.
  • ID của bảng POSTS sẽ tăng dần nên phải vào đó lấy ID mới nhất và cộng thêm 1. Với ID này ta cũng dùng để làm đường dẫn đến bài viết luôn.
  • User thì ta sử dụng user mặc định Admin có ID là 1.
  • Thời gian tạo và sửa đổi ta sử dụng hàm NOW() hoặc SYSDATE()

Chi tiết code tại: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/Save_content_in_wordpress.py

Load dữ liệu từ file csv lên với thư viện Pandas. Đối với file csv ta cần chuẩn hóa bỏ toàn bộ dấu ngoặc kép và loại bỏ các link trùng bằng excel. Mục tiêu của ta sẽ lấy dữ liệu của từng link và đưa vào bảng POSTS của wordpress. Thử load và in ra màn hình lần lượt từng row trong file csv.
Chi tiết code tại: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/Get_link_from_filecsv.py

Cuối cùng ta có thể ghép code

Cuối cùng ta có thể ghép code các phần trên này lại để lấy lần lượt nội dung từng link để đưa vào CSDL wordpress. Trong phần này ta cần lưu ý đối với mỗi link, ta lấy được 2 cấu trúc table như nhau về định danh (cùng là table và có tham số table là {“border”:”0″, “width”:”90%”,”cellpadding”:”3″,”cellspacing”:”0″}) nhưng 1 cái sẽ là nội dung ta cần lấy. Một cái sẽ là gợi ý các link khác mà ta không cần vì nó không phải là nội dung thơ văn. Và một điều lưu ý nữa là chỉ các link có nội dung là bài thơ mới có cấu trúc ta đã chỉ ra ở trên, các link list tác giả, list bài thơ, list mục sẽ không cấu trúc đó nên sẽ không insert vào hệ thống (Nếu cùng cấu trúc thì ta phải chuẩn hóa các link trước).
Chi tiết code tại: https://github.com/phamkhactuy/python_crawl_thoca/blob/master/Finall_code_crawl.py

Link data.

Ta đã có kết quả cho việc crawl này

https://raw.githubusercontent.com/phamkhactuy/python_crawl_thoca/master/Trang_quan_tri.JPG
https://raw.githubusercontent.com/phamkhactuy/python_crawl_thoca/master/insert_POSTS.JPG
https://raw.githubusercontent.com/phamkhactuy/python_crawl_thoca/master/Giao_dien_trang.JPG

Chỉnh sửa ảnh crawl thành của mình

Trong quá trình làm quen với việc crawl dữ liệu của người khác, từ thực tiễn liên quan mình có một bài toán cần đặt ra với dữ liệu về ảnh.

Có mối liên quan đến ảnh có thể xử lý khi crawl như sau:

  • Crawl đường dẫn ảnh mà thôi, nghĩa là lấy một website lưu về trang của mình nhưng không lấy ảnh đó về. Người dùng khi xem ảnh trên trang clone của mình nhưng bản chất ảnh vẫn ở trang kia. Chẳng may ảnh nó die thì mình không hiển thị được. Tất cả băng thông hoặc mấy thứ khác nó sẽ chịu hết.
  • Crawl cả ảnh về server của mình, coi như đứt đoạn luôn. Thành của mình hết, nó có die thì mình chẳng ảnh hưởng gì.

Khi lấy cả ảnh lưu về server của mình nhưng ảnh đó đã được công cụ tìm kiếm (GOOGLE) đánh index. Liên quan đến bản quyền, xếp rank, chính sách… ta cần phải chỉnh sửa đi. Ta cần làm các thao tác sau:

  • Đổi tên ảnh: Cái này là cái nên làm đầu tiên
  • Đánh dấu nó là của trang mình (ăn cắp còn đánh dấu là của mình) bằng cách hiển thị text lên ảnh. Có thể là nội dung mình thích hoặc viết tên miền của mình lên.
  • Làm một số việc khác như: Chèn logo, lồng khung, thêm icon…
  • Tất nhiên xóa đánh dấu của nó đi nếu được nữa
  • Điều chỉnh lại kích thước của ảnh

Crawl đã tự động thì việc này ta cũng cần làm tự động luôn. Ý tưởng ban đầu nghĩ đến đó là sử dụng thư viện về chỉnh sửa ảnh như Opencv nổi tiếng. Code thì có thể dùng tự do nhưng đầu tiên cứ thử thằng Python cho đơn giản (có thể không đơn giản).