เทคนิคในการตรวจสอบจำนวนคอลัมน์ในไฟล์ CSV ด้วยคำสั่ง AWK

awk และไฟล์ csv

AWK เป็นคำสั่งที่ส่วนใหญ่จะติดมากับ Linux (แต่ก็สามารถหาลงได้บน Windows, Mac ก็น่าจะมีนะ) ซึ่งตัวคำสั่งจะรับ Standard Input แบบ String เข้าไปประมวลคำเป็นบรรทัดและคอลัมน์ ได้สะดวก อย่างเช่นถ้ารับข้อมูลเป็น

A B C
D E F

AWK จะเริ่มประมวลคำเป็นบรรทัดๆ บรรทัดแรกคือ “A B C” โดยที่ A จะถูกจับคู่เป็น $1, B คือ $2, … เป็นต้น

นอกจากนี้ AWK ยังมาความสามารถในการทำงานคล้ายๆรูปแบบ BASH Script คือมีตัวแปร, IF-ELSE และบวกลบตัวเลข ซึ่งมีประโยชน์มากในการใช้งานร่วมกับข้อมูล String ที่มีรูปแบบอย่าง CSV หรือ Log File ซึ่งไว้จะเล่าต่ออีกที แต่ตอนนี้นำมาใช้เป็นเทคนิคในการตรวจสอบจำนวน Column

ทำไมต้องตรวจสอบจำนวนคอลัมน์

ปัญหาเริ่มมาจากงานที่ทำในวิชา Software Design and Developement ที่เรียน ป.โท อยู่ ต้องทำการนำเข้าข้อมูลที่เป็น CSV และ Excel เข้าไปยังระบบก่อน แต่ก็เหมือนแกล้งแกมจำลองปัญหา อาจารย์บอกว่าข้อมูลน่าจะไม่ตรงหลักทุกแถว ซึ่งก็เป็นไปได้ในการทำงานจริง จึงลองหาวิธีตรวจสอบไฟล์ CSV เบื้องต้น โดยใช้คำสั่ง AWK ที่เคยใช้มาแก้ปัญหา

$>awk -F’,’ ‘$NF!=12 {print $FNR “ “ $NF;}’ building-room.CSV 
86 13
87 13
88 13
89 13
90 13
1813 14
1814 14
1815 14
1816 14
1817 14

ตามตัวอย่างนี้ AWK จะนำไฟล์ building-room.CSV เข้าไปประมวลคำ โดยกำหนดเงื่อนไขไว้สองส่วนด้วยกัน

  • ส่วนแรก -F\’,\’ จะเป็นการกำหนดให้ AWK ทำการตัดตัวแปรในแต่ละบรรทัด $1, $2, … โดยดูจาก ‘,’
  • ส่วนที่สองจะเป็นการตรวจสอบเงื่อนไขว่าจำนวนตัวแปรที่ตัดได้ (จำนวนคอลัมน์) ตรงกับค่าที่ควรจะเป็นหรือไม่ ซึ่งในที่นี้คือ 12 โดยหากข้อมูลไม่ตรงก็จะทำตามชุดวงเล็บที่ต่อกับเงื่อนไขนั้น คือให้ทำการ print $FNR และ $NF ซึ่งหมายถึงตำแหน่งของบรรทัดที่พบว่าคอลัมน์ไม่ตรงและจำนวนที่นับได้ ตามลำดับ

จากการรัน AWK เพื่อตรวจสอบจำนวนคอลัมน์ในไฟล์ฯ จะทำให้เราทราบว่ามีบรรทัดที่มีความผิดพลาดไม่ตรงกับจำนวนคอลัมน์ที่ควรจะเป็นอยู่ 10 โดยมี คอลัมน์ที่เกินและขาดอย่างละ 5 ซึ่งจะช่วยให้เราสามารถตรวจสอบข้อมูลได้เบื้องต้น ก่อนนำไปใช้ในการพัฒนาฯ หรือเครื่องมือวิเคราะห์อื่นๆ



Originally published at ubinix-warun.postach.io on March 13, 2014.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.