ช่วยออกแบบโปรแกรม Import ไฟล์ เกี่ยวกับ Text File หน่อยครับ
ปัญหามีอยู่ว่า มี Text file (CSV) ทั้งหมด 40 แบบ ซึ่งไม่เหมือนกันเลย
แต่ละแบบ มีข้อมูลที่เราต้องการอยู่วางไม่เหมือนกันแต่ละไฟล์
เช่น ข้อมูล บางไฟล์วางไว้ที่ A:2 บางไฟล์วางที่ A:5
ทำให้เราไม่สามารถ กำหนดได้เลยว่าเราจะเลือกตัดไปใส่ใน Database และข้อมูลมีทั้งหมดประมาณ 15 Field
เราจะทำการออกแบบอย่างไรให้สามารถจัดการกับข้อมูลเหล่านี้ และสามารถดึงข้อมูลมาใช้ได้อย่างง่ายขึ้น
ผมก็เคยทำนะ.. แต่เหนื่อยพอสมควรเลยถ้ารูปแบบมากมายขนาดนั้น ผมเคยเขียนจัดการไฟล์ 17 รูปแบบ ซึ่งก็ต้องใช้เงื่อนไขต่างๆเข้ามาช่วยในการตัดสินใจว่าจะใช้รูปแบบไหนมาใช้นั่นแหละ... แต่สุดท้ายไม่สามารถมารถควบคุมรูปแบบได้ เพราะความต้องการมีมากขึ้น...
งั้นผมเสนอแนวทางนึงละกัน... กรณีที่ไม่มีจุดร่วมใดๆเลยที่จะมาเป็นตัวบอกว่าจะเป็นรูปแบบไหน เช่น ชื่อไฟล์ หรือไม่มีหัวตาราง แต่คิดว่าน่าจะมีลักษณะเฉพาะของฟิลดิ์ (น่าจะมีนะ)...
1. ก่อนอื่นก็ต้องหาลักษณะเฉพาะตัวของฟิลดิ์ต่างๆออกมาก่อน เพื่อใช้ในการเขียนฟังก์ชั่นตรวจสอบ เช่น ฟิลดิ์ที่เก็บบัตรประชาชนก็ต้องมี 13 หลัก หรือฟิลดิ์ descript ก็น่าจะเป็นฟิลดิ์ที่ยาวพอสมควร (น่าจะมากกว่าชื่อ-นามสกุล) ฟิลดิ์ราคาก็น่าจะเป็นฟิลดิ์ที่มีตัวเลขพร้อมจุดทศนิยม เป็นต้น ถ้าทุกๆฟิลดิ์มีเอกลักษณ์เฉพาะตัวแตกต่างชัดเจนก็เป็นไปได้ที่จะผ่านได้ครับโปรเจคนี้
2. ขั้นตอนการนำเข้าก็ใช้ฟังก์ชั่นที่ใช้ตรวจสอบแต่ละแบบ (ถ้ามี 10 ฟิลดิ์ก็ 10 แบบ) ตรวจสอบทุกฟิลดิ์ก่อน เพื่อใช้ในการตัดสินใจว่าฟิลดิ์นั้นจะนำเข้า Database ฟิลดิ์ไหน สมมติฟิลดิ์แรกสามารถตรวจสอบได้ว่าเป็นเลข 13 หลักก็ตั้งค่าตัวแปรฟิลดิ์ที่ 1 เป็น cid ประมาณนี้ โดยการตรวจสอบอาจจะตรวสอบสัก 5-10 เรคคอร์ดก็ได้ตามความจำเป็น
3. เมื่อตรวสอบเรียบร้อยแล้วก็ import เข้า database ได้เลย
การใช้ฟังก์ชั่นตรวจสอบแบบนี้อาจจะต้องคำนึงถึง performance ของระบบด้วย ในตอนที่ผมทำนั้นมีการปรับเปลี่ยนข้อมูลภายในฟิลดิ์ด้วย
ผมไม่เข้าใจว่า 40 แบบ หมายถึงอะไร ไฟล์ csv 40 แบบ import ใส่ตาราง 40 ตาราง (คนละตาราง ไม่ซ้ำกัน) หรือว่า
ไฟล์ csv ท ี่เป็นไปได้ 40 แบบ import ใส่ตารางเดียว
สำหรับกรณีแรก การจะเลือกว่าจะไปลงตารางใด ก็ต้องดูขอบเขตของข้อมูล เป็นหลัก ซึ่งมีได้หลายอย่างที่ใช้เป็นตัวบ่งชี้ได้ว่าควรจะไปยังข้อมูลใด เช่น จำนวนคอลัมน์ ชนิดของข้อมูล คล้ายๆ คำตอบแรก
ส่วนกรณีที่ 2 คงจำเป็นต้องหาจุดร่วม ว่า รายการไหน ควรจะเป็นข้อมูลใด หากข้อมูลเป็นแค่การสลับคอลัมน์ ก็ไม่คิดว่าน่าจะยากนะ หากข้อมูลเป็นการระบุหัวคอลัมน์ที่แตกต่างกัน อันนี้เราอาจใช้ if ในการเลือกได้ (โดยส่วนตัวผมใช้ Array)
ในทางปฏิบ้ติ วิธีเดียวที่จะทำได้ก็คือ เราต้องดูว่า เรา(มนุษย์)ใช้อะไรเป็นเครื่องตัดสินใจว่าข้อมูลนั้นๆ จะใส่ลงในฟิลด์ไหน ให้เราเขียนคำสั่งให้เป็นไปตามที่เราคิดครับ เช่น ฟิลด์ name จะต้องมีอะไรบ้าง ถึงจะเข้าองค์ประกอบของข้อมูลทีควรจะเป็น name ซึ่ง จะต้องดูจากข้อมูลที่เป็นไปได้ทั้งหมดที่มี และ ฐานข้อมูลครับ ซึ่งคงไม่มีใครออกแบบให้ใครได้ นอกจากคนที่รู้กฏของมันเท่านั้น
<?php
$data = 10.50;
$data = '27-09-2553';
if(preg_match('/[0-9]+\.[0-9]{2,2}/', $data)) {
// ฟิลด์ จำนวนเงิน เช่น 10.50
} elseif (preg_match('/[0-3]?[0-9]\-[0-1]?[0-9]\-[0-9]{4,4}/', $data)) {
// ฟิลด์ วันที่ 27-09-2553
}
?>
ไฟล์ 40 แบบใส่ตารางเดียวคับผม ซึ่งแต่ละ Colum ข้อมูลอยู๋ไม่เหมือนกันใน 40 ไฟล์ ที่เป็นปัญหาเพราะว่าลูกค้าส่งข้อมูลมาไม่เหมือนกัน รายละเอียดแค่คล้ายกันครับ
ขอบคุณทั้งสองท่านมากๆครับ พอดีผมก็คิดว่าจะทำแบบเช็คก่อนว่าข้อมูลตามเงื่อนไขหรือไม่ ถ้าใช่ก็เอาลง Database
แต่เพื่อมีท่านใดมีวิธีการที่น่าจะทำได้ดีกว่าครับ เพราะว่ากัวสิ่งที่ผมคิดว่าจะทำ ถ้าผมจะทำขึ้นมาจริงๆ ถ้า ฟิวด์เยอะๆ คงแย่ๆแน่เลย