เดือนที่ผ่านมา เจองานด่วนข้อมูลค่อนข้างเยอะ และละเอียดอ่อน ขอสรุปเครื่องมือที่ใช้คร่าวๆ เผื่อใครเห็นแล้วจะได้เอาไปใช้ตามบ้าง


Photo by Barn Images / Unsplash

งานที่ทำคือ มีข้อมูลมาให้ที่เป็นไฟล์ Excel ประมาณสัก 1 ล้านรายการ (เกือบๆถึง) แยกๆไฟล์มาจากหลายๆที่ รูปแบบไม่เหมือนกันซะทีเดียว ผมต้องจัดการเอาข้อมูลเหล่านั้นเข้าระบบ โดยผมเลือกใช้ Python ในการจัดการข้อมูล โดยการแปลงไฟล์ Excel ไปเป็น CSV จากนั้นค่อยเอามันลงฐานข้อมูล มีหลายๆคนแนะนำ Pandas แต่ผมไม่มีเวลาอ่านเอกสารเลย ลองอ่านไปนิดหน่อย ก็เข้าใจยาก ไม่มีเวลามากพอ เลยเลือกใช้ import csv ของ Python มาใช้เลย

ขั้นตอนการเริ่มเอาเข้าก็คือ มีทีมงานช่วยกันคัดกรองข้อมูล จัดรูปแบบ และเติมตัวแปรเข้าไปให้ที่บรรทัดบนๆของไฟล์ Excel เพราะข้อมูลที่ได้มา เราต้องเอามาจับกับตัวแปรที่จะเอาเข้าฐานข้อมูล หลังจากจัดรูปแบบไฟล์ Excel ใหม่ ผมก็ใช้ LibreOffice เปิดดูคร่าวๆ จากนั้นส่งไฟล์ Excel ขึ้นไปบนเซิฟเวอร์ และแปลงจาก Excel ไปเป็น CSV ด้วย xlsx2csv เพราะทำการแปลงไฟล์บนเครื่องคอมพับตัวเองไม่ไหว ไฟล์ใหญ่และใช้เวลานานมาก คอมถึงกับค้างเลยทีเดียว

วิธีแปลงไฟล์ทำแบบนี้

xlsx2csv -s 1 input.xlsx output.csv
ls
intput.xlsx output.csv
...

พอได้ไฟล์ csv มาแล้ว ก็ยังใช้งานไม่ได้ เพราะมีส่วนเกินของ cell ที่เป็นค่าว่างๆ ไม่มีตัวแปร ต้องจัดการตัด ลบ แก้บางค่า

ตัวอย่างไฟล์ที่ได้

ลำดับ,เลขบัตรประจำตัวประชาชน,คำนำหน้า,ชื่อ,นามสกุล,จังหวัด,อำเภอ,,,,
objectId,pid,title,firstname,lastname,address_province,address_amphoe,,,,
1,1-000-000-000-001,นาย,จอห์น,ชาวไร่,กรุงเทพมหานคร,เขต บางกะปิ,,,,
2,1-010-000-000-001,นาย,ทรัมป์,แห่งบางเขน,กรุงเทพมหานคร,เขต บางเขน,,,,
3,1-020-000-000-001,นาย,จัสติน,ร่ำรวย,กรุงเทพมหานคร,เขต มีนบุรี,,,,
,,,,,,,,
,,,,,,,,

ข้อมูลข้างบน ยังเอาเข้าโปรแกรมที่ไว้นำเข้าข้อมูลไม่ได้ ซึ่งข้อมูลจริงๆ ที่โปรแกรมจะเอาไปใช้ได้เลยคือแบบนี้

objectId,pid,title,firstname,lastname,address_province,address_amphoe
1,1-000-000-000-001,นาย,จอห์น,ชาวไร่,กรุงเทพมหานคร,บางกะปิ
2,1-010-000-000-001,นาย,ทรัมป์,แห่งบางเขน,กรุงเทพมหานคร,บางเขน
3,1-020-000-000-001,นาย,จัสติน,ร่ำรวย,กรุงเทพมหานคร,มีนบุรี

ส่วนของอำเภอจะไม่ใช้เขตให้ตัดทิ้งได้เลย ผมเลยได้ลองใช้ command line ที่หลากหลายมากขึ้นคือ sed, cut 2 ตัวนี้ต้องขอบคุณมันมากๆ คำสั่งที่ผมทำให้ได้ค่าที่ต้องการคือ

cat output.csv | sed '1d' | sed '5,$d' | cut -d, -f1-7 | sed 's/เขต //g' > formated_output.csv

จากนั้นผมก็ใช้มันเป็น input ของโปแรกรมที่เขียนไว้ได้เลย

python importer.py --files formated_output.csv

ในโค้ด importer.py โค้ดคร่าวๆแบบนี้

import argparse
import csv
parser.add_argument('--files', nargs='*')
args = parser.parse_args()
filenames =  args.files
for f in filenames:
    reader = csv.DictReader(open(f))
    for row in reader:
        # do_insert_row_to_database(row)

ส่วนของ Database เป็น MongoDB ใช้ PyMongo ใช้ง่ายดี

สำหรับการแก้ไขอะไรด่วนๆ เล็กๆ น้อยๆ ก็ใช้ Mongo Express โดยรันมันผ่าน Docker เลย ตามนี้ library/mongo-express/

แต่พอจะแก้ไขข้อมูลอะไรด่วนๆ แต่ไม่เยอะมาก ผมเลยติดตั้ง Jupyter ผ่าน Docker อีกเหมือนกัน โดยใช้ jupyter/base-notebook ติดตั้งเสร็จบนเซิฟเวอร์ที่เป็น Private Network ผ่าน VPN ทีนี้ก็สบายเลยครับ มี Interactive Python ให้ใช้สบายๆ กดๆจิ้มๆ จากนั้นก็เขียนโค้ดออกรายงาน เช่น แบ่งตามจังหวัด แบ่งตามสถานะ กดจิ้มเดียว ได้ไฟล์ CSV ออกมาแยกจังหวัด เอาไปใช้ได้ต่อเกือบทันที

จริงๆยังมีเครื่องมืออื่นๆอีก เอาไว้เขียนวันหลังบ้าง จบแค่นี้ก่อน ขี้เกียจ

return 100