Copy File ไปไว้ใน Folder ต่าง ๆ ทีละมาก ๆ นี้จะทำโดยใช้คำสั่งใน Command Prompt
คราวนี้ได้รับโจทย์มาว่า มีข้อมูลไฟล์จำนวนหนึ่ง (ประมาณ 15,000 ไฟล์) จะต้องแยกไฟล์แต่ละไฟล์ไปไว้ตามโฟลเดอร์ตามอำเภอและจังหวัด ซึ่งถ้าต้องมาลากด้วยมือทีละไฟล์คงจะเป็นเรื่องที่ปวดหัวและเสียเวลาไม่น้อย จึงมาปรึกษาว่ามีวิธีที่ง่ายกว่าการลากไฟล์ไปไว้ในโฟลเดอร์ที่ละไฟล์หรือไม่
ก็เลยสอบถามไปว่า แล้วจะรู้ได้อย่างไรว่าไฟล์ไหนจะต้องไปอยู่อำเภอไหน จังหวัดไหน ผู้สอบถามก็แจ้งว่าได้ทำลิสต์รายชื่อเอาไว้เรียบร้อยแล้ว เมื่อได้เห็นไฟล์เอ็กเซลที่ผู้สอบถามแล้วก็รู้สึกว่ามีหนทางที่พอจะง่ายอยู่บ้าง
จะใช้วิธีจับคู่ระหว่างลิสต์รายชื่อในไฟล์เอ็กเซลที่มีรายชื่ออำเภอ จังหวัด ทำเอาไว้เรียบร้อย เข้ากับรายชื่อไฟล์ที่เก็บไว้ จะได้รู้ว่าจะสั่งให้ไฟล์ไหนไปอยู่ในโฟลเดอร์ไหน ที่คิดในใจคือจะใช้คำสั่ง command prompt ในการย้ายไฟล์
แต่ในเมื่อเป็นการย้ายแบบเฉพาะเจาะจงชื่อชัดเจน เรื่องชื่อไฟล์จึงเป็นสิ่งสำคัญ ซึ่งเท่าที่เห็นข้อมูลในมือ ก็มีปัญหาอยู่สองสามประการที่ต้องแก้ปัญหาก่อน
อย่างแรก ไฟล์ที่ต้องการย้าย จะมีปี พ.ศ. ต่อท้าย ในขณะที่ลิสต์รายชื่อที่น้องให้มาไม่มี พ.ศ. ต่อท้าย นั่นหมายความว่าจะเป็นการจับคู่แบบ one-to-many คือรายชื่อในไฟล์เอ็กเซล 1 ชื่อจะจับคู่กับไฟล์จริงมากกว่า 1 ไฟล์
ประการต่อมา เราจะรู้ได้อย่างไรว่าลิสต์ไฟล์ที่มีอยู่ครบถ้วนสมบูรณ์ตามที่น้องต้องการ จะมีไฟล์ไหนตกหล่นหรือไม่ ดังนั้น การแก้ปัญหานี้จะไม่ใช่เรื่องการย้ายไฟล์อย่างเดียว
แก้ปัญหาเรื่องชื่อก่อน
เมื่อได้เห็นชื่อไฟล์ สิ่งที่เห็นอย่างแรกก็คือ การเว้นวรรคบางชื่อไม่ตรงกัน อย่างอาคารชุด 15 สูท จะมีทั้ง “15 สูท” และ “15สูท” ถ้ามีการจับคู่เกิดขึ้น เราตั้ง “15 สูท” ไว้มันจะไม่จับคู่กับ “15สูท” และบางชื่อ เช่น 101/1 ไม่สามารถตั้งเป็นชื่อไฟล์ได้ เพราะ windows จะไม่อนุญาตให้ใช้ / ในชื่อ ทางผู้ดำเนินการจึงแก้ไขปัญหาด้วยการใช้ขีดล่าง “_” แทน ตรงนี้ก็ต้องแก้ไข เพราะในลิสต์รายชื่อใช้เป็น 101/1 แต่ไฟล์ใช้ชื่อ 101_1
วิธีแก้ปัญหาคือ ต้องสร้างลิสต์ใหม่เพื่อใช้เป็น key สำหรับเชื่อมโยงทั้งสองตารางเข้าด้วยกัน ใช้ชื่อตรง ๆ ไม่ได้ ต้องใช้ ชื่อที่ผ่านการ “ทำความสะอาด” เรียบร้อยแล้วมาใช้ คือเอาวรรคออก เปลี่ยน _ ให้เป็น / (หรือจะกลับกันก้ได้ไม่ซีเรียส คือเปลี่ยนเพื่อให้มันเชื่อมกันเจอเท่านั้น)
คือ เก็บรายชื่อไว้เป็นเอ็กเซลก็ใส่แบบมีช่องว่างตามปกติ แต่สร้างคู่ขนานมาอีก 1 คอลัมน์ ทั้งทางฝั่งลิสต์รายชื่อที่ระบุว่าจะให้อยู่อำเภอจังหวัดใด และ ทางฝั่งชื่อไฟล์
จัดการ ลิสต์รายชื่อ เอาไว้ก่อน โดยใช้คำสั่ง dir ตามที่เคยได้เขียนถึงไปแล้ว ก็จะได้รายชื่อไฟล์เป็น text file นำเข้ามาเปิดใน Excel ได้เลย จากนั้นจัดการแยกเอาเฉพาะรายชื่อก่อน ซึ่งอันนี้แยกไม่ยาก แต่น่าปวดหัว เนื่องจากตั้งชื่อกันสะเปะสะปะกันไปหมด อย่างเช่น – ก่อนหน้าปีพ.ศ. มีทั้งวรรคและไม่วรรค ซึ่งต้องจัดการเรื่องพวกนี้ก่อน โปรดอ่านสิ่งที่เคยเขียนไปแล้วคือ Text To Columns การแยกตัวเลขออกจากตัวอักษร และการแยกข้อความจากทางด้านขวาโดยมีตัวคั่น สูตรที่ใช้อยู่ในนั้นหมดแล้ว
นอกจากนี้ เพื่อเป็นการจัดการข้อความสำหรับการนำมาเชื่อมกับ ลิสต์ที่ว่ามันจะต้องไปอยู่โฟลเดอร์อำเภอ จังหวัด ก็ต้องจัดการ เอา ช่องว่าง หรือ วรรค ออกจากข้อความให้หมด โดยใช้ Replace (Ctrl+H) Find ช่องว่างด้วยการเคาะวรรค แล้วตรงแทนที่ไม่ต้องทำอะไรกับมัน (ก็คือแทนที่ช่องว่างด้วยการไม่เอาช่องว่าง) ก็จะได้รายชื่อที่ไม่มีช่องว่างแทรกตัวอยู่ หรืออย่างในตัวอย่างจะใช้คำสั่ง Trim กับ Substitute เพื่อจัดการ
ก็จะได้ตารางที่มีชื่ออาคารชุด (แบบไม่มีเว้นวรรค) มาหนึ่งตาราง
ขอบ่นแทรกตรงนี้นิดนึง
เคยบอกหลายครั้งหลายคราแล้วว่า การทำงานกับข้อมูลจำนวนมาก จะต้องมีการวางแผนและจัดระเบียบการทำงานให้ชัดเจน การบันทึกข้อมูลเป็นงานที่น่าเบื่อและหลายคนอยากให้ทำให้เสร็จ ๆ ไป จนไม่คำนึงถึงรูปแบบว่ามันไม่ได้อยู่ในรูปแบบเดียวกัน คือทำงานให้มันพ้น ๆ ตัวไป ก็จะส่งผลกระทบต่อการจัดการในภายหลังอย่างนี้ อันนี้ถ้าจัดระเบียบตั้งแต่ต้น ที่เขียนมาทั้งหมดก็ต้องไม่ต้องทำด้วยซ้ำ
กลับมาเรื่องการจัดการต่อ
ได้ตารางที่มีชื่ออาคารชุด (แบบไม่มีเว้นวรรค) มาหนึ่งตาราง ก็ดึงข้อมูลจากลิสต์รายชื่ออีกอัน ว่ามันอยู่ในอำเภอจังหวัดอะไร โดยใช้ Vlookup หรือว่า index & Match อันนี้ไม่น่ายาก
Copy File ไปไว้ใน Folder ต่าง ๆ ทีละมาก ๆ
ถึงขั้นที่ว่าเราได้ข้อมูลเรียบร้อยแล้วว่า ไฟล์ไหน (จากคอลัมน์ A) จะเอาไปใส่ในโฟลเดอร์ใด (แยกตามคอลัมน์ G และ H)
คำสั่ง Command Prompt ที่ใช้ในการ Copy File คือ Robocopy ซึ่งการเขียนคำสั่งง่ายมาก นั่นคือ
Robocopy โฟลเตอร์ต้นทาง โฟลเดอร์ปลายทาง ชื่อไฟล์
ตัวอย่างเช่น เราจะย้ายไฟล์ชื่อ สุขุมวิท-2539.pdf จาก D:\Temp\ ไปที่ D:\Temp\กรุงเทพ\เขตพระโขนง คำสั่งก็จะเป็น
Robocopy D:\Temp\ D:\Temp\กรุงเทพ\เขตพระโขนง\ สุขุมวิท-2539.pdf
ดังนั้นสิ่งที่ทำก็คือสร้างคำสั่ง Robocopy โดยจะใช้วิธี รวมข้อความเข้าด้วยกัน คือ
=CONCATENATE("robocopy ",B2," D:\Temp\",H2,"\",G2,"\"," ",C2)
หรือจะใช้ & แทน Concatenate ก็ได้เหมือนกัน แล้วแต่เอาที่สะดวก
Copy สิ่งที่เราได้ไปวางใน notepad และ Save เป็น ชื่อไฟล์อะไรก็ได้.bat ตรงนี้ระบุไปเลยว่าจะเซฟเป็น .bat ซึ่งเป็นตัว run command prompt แต่ถ้าเผลอเซฟเป็น .txt ไปก็ไม่เป็นไร แก้ไขภายหลังด้วยการ rename ไฟล์ธรรมดานี่เอง
เมื่อได้ไฟล์ .bat แล้วก็ ดับเบิลคลิก เพียงเท่านี้เอง เสร็จแล้ว
ในตัวอย่างนี้เป็นการใช้คำสั่ง copy แต่ถ้าต้องการ ย้ายไฟล์ โดยไม่ copy ก็เปลี่ยนคำสั่งไปใช้ move แทน