You are currently viewing ลองเขียน python แทนการทำงานด้วย Microsoft Access

ลองเขียน python แทนการทำงานด้วย Microsoft Access

ลองเขียน python นี้จะแสดงตัวอย่างว่าทำไมต้องหันมาใช้ python ช่วยในการทำงาน แทนการทำงานแบบเดิมที่ใช้ Microsoft Access

สังเกตว่าคนอายุรุ่นราวคราวเดียวกันหลายท่านไม่สนใจเรียนรู้การเขียนโค้ดต่าง ๆ เพราะรู้สึกว่าเป็นเรื่องไกลตัว เวลาเห็นคนพิมพ์ตัวอักษรยาวติดกันในหน้าจอคอมพิวเตอร์แล้วคิดว่าเป็นอีกโลกหนึ่งที่ไม่เกี่ยวข้องกับตัวเอง เป็นเรื่องของโปรแกรมเมอร์ซึ่งทำงานซับซ้อน ในขณะที่ตัวเองทำงานออฟฟิศธรรมดา ๆ ไม่รู้ว่าการเขียนโค้ดจะช่วยทำอะไรได้บ้าง

แต่ถ้าเรามองว่า โค้ดเป็นเพียงเครื่องมือหนึ่งที่จะเข้ามาช่วยให้เราทำงานง่ายขึ้น สบายขึ้น อาจจะช่วยให้ท่านเปลี่ยนใจหันมาสนใจการเขียนโค้ดมากขึ้น เพื่อใช้ทำงานทั่วไปในออฟฟิศนี่แหละ อยากให้คิดว่าการเขียนโค้ด คือภาษาหนึ่งที่ใช้สื่อสารกัน เหมือนเรียนภาษาอังกฤษ ภาษาจีน เพื่อสื่อสารกับคนต่างชาติ แต่นี่เราเขียนโค้ด เพื่อสื่อสารกับคอมพิวเตอร์ให้ทำงานอย่างที่เราต้องการ

วิดีโอในยูทูป

เพื่อให้เห็นภาพ จะยกตัวอย่างงานสักงานหนึ่ง เป็นงานเชื่อมชุดข้อมูล 2 ชุดเข้าด้วยกัน เดิมทีจะใช้ Microsoft Access ในการทำงาน แต่ตอนนี้เปลี่ยนมาใช้การเขียนโค้ด python ในการทำงานแทน ซึ่งในตัวอย่างนี้จะเป็นเหตุผลว่าทำไมถึงเปลี่ยนมาใช้ไพธอน

มาดูข้อมูลต้นทางก่อน

ข้อมูลต้นทาง

ข้อมูลต้นทางจะเป็น Text Files ข้อมูลชุดหนึ่งชื่อว่า “Process” ส่วนอีกชุด ชื่อว่า “Regis” ซึ่งจะเป็น .txt file จำนวนมากกว่า 50 ไฟล์ ที่ต้องนำมารวมกันก่อนนำไปเชื่อมข้อมูลเข้ากับ “Process”

สิ่งที่ต้องตรวจเช็คก่อนดำเนินการก็คือ ไฟล์ที่ต้องทำงานด้วย มีหัวตารางข้อมูลหรือไม่ ใช้อะไรเป็นตัวคั่นฟิลด์ ใช้ encoding อะไร และเราจะใช้ฟิลด์ใดเป็น key สำหรับเชื่อมโยงข้อมูล

txt file

ซึ่งในตัวอย่างนี้ ไฟล์ทั้งหมดมีหัวตารางเรียบร้อย และใช้ ‘|’ เป็นตัวคั่น encoding เป็น utf-8

1

ทำใน Microsoft Access

จะเริ่มทำงานกับชุดข้อมูล Process ก่อน สิ่งที่จะต้องทำก็คือ

  1. อ่านไฟล์ text
  2. กำหนดประเภทข้อมูล เนื่องจากมีการเก็บรหัสเป็นตัวเลขขึ้นต้นด้วย 0 เช่น 0014 ถ้าไม่กำหนดให้อ่านค่าเป็น string (หรือ text-ข้อความ) จะกลายเป็น 14 ซึ่งผิดจากความหมายดั้งเดิมโดยสิ้นเชิง
  3. เลือกเฉพาะบางคอลัมน์ที่ต้องการ 

มาเริ่มที่ Access ก่อน เราจะนำเข้าข้อมูลจาก Text File เข้ามาเป็นตารางพร้อมจัดการเรื่องต่าง ๆ ให้เรียบร้อยอย่างที่อธิบายข้างต้น

วิธีการ เริ่มต้นด้วย

External Data > New Data Source > From File > Text File

เลือกไฟล์เข้ามา จะมี Import Text Wizard เพื่อช่วยให้เรานำเข้าอย่างถูกต้อง โดยเราจะต้องเลือก delimited หรือ นำเข้าแบบกำหนดตัวแบ่งคอลัมน์ จากนั้นเลือก ‘|’ เป็นตัวคั่นคอลัมน์ เลือก First Row Contains Fields Name

ลองเขียน python แทนการทำงานด้วย Microsoft Access

แค่นั้นยังไม่พอ ยังต้องกด Advance  เพื่อจัดการข้อมูลต่อ

หน้าต่างที่ปรากฏขึ้นมาเรียกว่า import specification 

ตรงนี้เรากำหนดทุกอย่าง ทั้ง ตัวคั่น Encoding ซึ่งต้องเลือกให้เป็น utf-8 และให้ดูด้านล่างที่เป็น Field Information:

เรากำหนดประเภทข้อมูล (Data Type) ให้เป็นอย่างที่ต้องการ คอลัมน์ที่จำเป็นต้องระบุว่าเป็น Short Text เปลี่ยนได้ในขั้นตอนนี้ และไม่ต้องการคอลัมน์ไหนให้ติ๊กถูกตรง skip 

กำหนดเสร็จสิ้นแล้วคลิก next ไปจนจบ

อ่านเพิ่ม Access Table

ลองเขียน python

สำหรับการใช้งานไพธอน เนื่องจากมีการเขียนโค้ดไว้แล้ว เราเพียงแค่เปลี่ยนไฟล์ที่ต้องการเท่านั้น 

สำหรับโค้ดหลักของส่วนนี้ก็คือ สร้าง DataFrame ชื่อ Process_df (ซึ่งก็เหมือนกับตารางชื่อ Process_df ใน Access)  ซึ่งจะเป็นการอ่านไฟล์แล้วแปลงเป็น DataFrame ด้วยฟังก์ชัน pd.read_csv ของ Pandas 

อ่านเพิ่มเติม text file กับ csv file เหมือนและต่างกันอย่างไร?

เราตรวจสอบในตอนแรกแล้วว่า ไฟล์เหล่านี้เข้ารหัส (encoding) เป็น UTF-8 และใช้ ‘|’ เป็นตัวคั่นคอลัมน์ และใช้ dtype เป็น string เพื่อกำหนดว่าให้นำเข้าไฟล์มาเป็น “ข้อความ” หรือ text  ทั้งหมด

(อันนี้ต้องอธิบายก่อนว่า ในโค้ดที่ใช้งานจริง จะระบุประเภทของแต่ละฟิลด์ ไม่ได้เหมารวมแบบโค้ดนี้ แต่เนื่องจากเห็นว่าทำเป็นตัวอย่างให้ดูพอเห็นเป็นคอนเส็ปต์ก็เลยรวบรัดโค้ด เพราะอย่างไรในกระบวนการนี้ก็ไม่ได้มีการคำนวณเกิดขึ้น) 

ตรงนี้ จาก Access เราจะได้ผลลัพธ์เป็นตารางชื่อ Process_df ส่วนไพธอนจะได้ DataFrame ชื่อ Process_df

ดูจากขบวนการเหล่านี้ ก็น่าจะพอเห็นแล้วว่า ถ้าเราใช้ไพธอน เราแค่ปรับแก้ส่วนที่ตั้งไฟล์ แค่นั้นกดคลิกรันก็ได้ผลลัพธ์ในเวลาไม่นานนัก ในขณะที่ Access เราต้องกดอีกหลายขั้นตอน 

หมายเหตุ เวลาทำงานกับ Access จริง ๆ เราอาจจะมีตัวช่วยคือสร้าง import specification เพื่อกำหนดตัวคั่น กำหนดรหัสอักขระ และเลือกคอลัมน์ที่ต้องการ เอาไว้ก่อนได้ แต่อย่างไรก็ไม่ได้ทำให้ใช้เวลาน้อยลงไปมากเท่าไหร่

2

ขั้นตอนต่อไป เราจะกรองข้อมูลในฟิลด์ Regcode ให้เอาเฉพาะ เฉพาะ ‘ข’ กับ ‘จ’ เท่านั้น ใน Access เราจะสร้าง Query ซึ่งสามารถสร้างเอาไว้ล่วงหน้าได้ ส่วนไพธอนเราเพียงแค่กดรันโค้ดเท่านั้นไม่ต้องแก้ไขอะไรเช่นกัน

Access Query
python

ใน Access  คือ Query ชื่อ “Filtered_process” และ ในไพธอนจะเป็น DataFrame ชื่อเดียวกัน

3

สองขั้นตอนข้างต้นเราอาจจะไม่เห็นความแตกต่างเท่าไหร่ แต่จากขั้นตอนจากนี้ไปจะเริ่มเห็นความแตกต่างมากขึ้น

สิ่งที่จะทำต่อไป เราจะทำงานกับชุดข้อมูล Regis ซึ่งมีจำนวนมากกว่า 50 ไฟล์ สิ่งที่เราจะทำขั้นตอนจะไม่ต่างจากขั้นตอนที่ 1 มากนัก นั่นคือ

  1. อ่านไฟล์
  2. กำหนดประเภทประเภทข้อมูล
  3. เลือกเฉพาะบางคอลัมน์ที่ต้องการ
  4. รวมทั้งหมดให้เป็นตารางเดียวกัน

แต่อย่าลืมว่า ข้อมูลของ Regis มีจำนวนมากกว่า 50 ไฟล์ซึ่งต้องนำมารวมกัน และจะมีข้อมูลเป็นปริมาณมากพอสมควรคือประมาณสองล้านเจ็ดแสนแถว (แต่ที่เคยทำมากที่สุดคือประมาณสามสิบสามล้านแถว)

ถ้าจะใช้วิธี รวมไฟล์ทั้งหมดเข้าด้วยกัน โดยใช้ Access จะไม่ใช่เรื่องยาก แต่เสียเวลา เพราะอาจจะหมายถึง ต้อง import และ append เข้าทีละไฟล์ แบบเดียวกับขั้นตอนที่ 1

(ไฟล์แรก นำเข้าแบบขั้นตอนที่ 1 ส่วนไฟล์ 2 เป็นต้นไปให้เลือกเป็น Append แทนที่จะสร้างตารางใหม่)

ถ้าใครเลือกวิธีนี้ อาจจะหมายถึงความเบื่อหน่าย สมมติเราใช้เวลาขั้นตอนละ 2 นาที จำนวนทั้งหมด 50 ไฟล์ก็เสียเวลาไป 100 นาทีแน่ ๆ ไม่รวมความมึนงงที่อาจจะนำเข้าผิดพลาด นำเข้าซ้ำ หรือหลงลืมบางไฟล์

แต่ โดยส่วนตัว จะเขียน VBA เพื่อช่วยนำเข้าไฟล์จำนวนมากเข้าในตาราง ซึ่งในตัวอย่างนี้ ทำโดยเขียน VBA เพื่อนำเข้าไฟล์ที่กำหนดมาลงในตารางเดียว จึงไม่เป็นปัญหาเรื่องเสียเวลาเท่าไหร่

ส่วนในไพธอน เราเพียงแค่กำหนดแหล่งที่ตั้งของไฟล์ และชื่อไฟล์ที่เราจะใช้ แล้วคลิกรันเท่านั้น

ใน Access จะได้เป็นตารางชื่อ Regis และในไพธอนจะได้เป็น DataFrame ชื่อ Regis

4

เชื่อมข้อมูลระหว่าง filtered_process กับ Regis ขั้นตอนนี้จะเห็นผลต่าง นั่นคือเมื่อทำ Query ใน Access แล้ว กลายเป็นว่าหน่วง และหนักจนถึงขั้น Not Responding ส่วนใน ไพธอนไม่มีปัญหาแต่อย่างใด

key Field

สาเหตุเป็นเพราะว่า เวลาทำ Query กับข้อมูลที่มีปริมาณมาก (ในที่นี้ Regis มีข้อมูลประมาณสองล้านเจ็ดแสนแถว) และ ยังเป็น Query ที่ซ้อนกับ Query อีก จะเห็นว่า การทำงานใน Access ก็ไม่ใช่เรื่องยาก แต่เมื่อมีปริมาณที่มากในระดับหนึ่งจะเริ่มมีปัญหาเรื่องการประมวลผล 

ในการทำงานจริงต้องเปลี่ยนจากทำงานรวดเดียว (ซึ่งทำไม่สำเร็จ) แบ่งไฟล์ทำทีละประมาณแสนแถว 

งานที่ไม่ยาก จึงกลายเป็นงานที่เสียเวลาและน่าเหนื่อยใจขึ้นมา

นึกถึงการทำงานซ้ำ ๆ หลายสิบครั้ง (และบางครั้งหลายร้อยครั้ง) อาจจะทำให้คนขี้เกียจ (เช่น DataRevol.com) เกิดความท้อขึ้นมาในบางขณะ

และนี่คือเหตุผลหลักที่ทำให้หันมาใช้ไพธอนในการทำงานแทน Access ในปัจจุบัน

ใน Access จะทำด้วย Query จะตั้งชื่อ Query ว่า Tran_df ส่วนในไพธอนก็จะทำเป็น DataFrame ชื่อ Tran_df

5

ส่งออกผลลัพธ์เป็น text file แยกตาม branchcode อันนี้ไม่มีอะไรมาก ใน Access กด Export ธรรมดา แต่เนื่องจากเราแก้ไขปัญหาในขั้นตอนที่ 4 ด้วยการแยกไฟล์เพื่อหลีกเลี่ยงปัญหา ทำให้ต้องเสียเวลาทำงานมากกว่าที่ควรจะเป็น

สรุป

ต้องบอกอีกรอบ ว่า DataRevol.com ไม่ใช่โปรแกรมเมอร์หรือคนที่มีความเชี่ยวชาญทางด้านนี้ เป็นเพียงพนักงานธรรมดา ที่ทำงานไปวันวัน เพียงแค่พยายามหาหนทางที่จะทำงานให้ง่ายขึ้น สบายขึ้นเท่านั้น และการเขียนโค้ด (เช่น ไพธอน) ก็เป็นอีกหนทางหนึ่ง สำหรับงานที่ทำซ้ำ ๆ มีลักษณะการทำงานแบบเดิม เราสามารถใช้งานเพื่อลดระยะเวลาทำงานของเราได้