Copy File ไปแต่ละ Folder ทีละมาก ๆ

Copy File ไปแต่ละ Folder ต่าง ๆ ทีละมาก ๆ นี้จะทำโดยใช้คำสั่ง DOS ใน Command Prompt แต่จะใช้ Excel มาช่วยในการจัดการรายชื่อและเขียนคำสั่ง

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

Copy File ไปแต่ละ Folder - รายชื่อไฟล์ต้นทาง

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

Copy File ไปแต่ละ Folder - มีรายชื่อว่าไฟล์ไหนต้องอยู่ folder ไหน

Copy File ไปแต่ละ Folder

จะใช้วิธีจับคู่ระหว่าง ลิสต์รายชื่อในไฟล์เอ็กเซล ที่มีรายชื่ออำเภอ จังหวัด ทำเอาไว้เรียบร้อย เข้ากับ รายชื่อไฟล์ที่เก็บไว้ จะได้รู้ว่าจะสั่งให้ไฟล์ไหนไปอยู่ในโฟลเดอร์ไหน ที่คิดในใจคือจะใช้คำสั่ง 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 อันนี้ไม่น่ายาก

คำสั่ง ROBOCOPY

ถึงขั้นที่ว่าเราได้ข้อมูลเรียบร้อยแล้วว่า ไฟล์ไหน (จากคอลัมน์ A) จะเอาไปใส่ในโฟลเดอร์ใด (แยกตามคอลัมน์ G และ H) ก็ถึงเวลา Copy File ไปแต่ละ Folder

คำสั่ง 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 File ไปแต่ละ Folder แต่ถ้าต้องการ ย้ายไฟล์ โดยไม่ copy ก็เปลี่ยนคำสั่งไปใช้  move แทน

ท่านสามารถอ่านรายละเอียด คำสั่ง ROBOCOPY ได้ที่เว็บนี้

ความคิดเห็นของคุณ :)

%d bloggers like this: