ช่วยออกแบบโปรแกรม Import ไฟล์ เกี่ยวกับ Text File หน่อยครับ


ปัญหามีอยู่ว่า มี Text file (CSV) ทั้งหมด 40 แบบ ซึ่งไม่เหมือนกันเลย

แต่ละแบบ มีข้อมูลที่เราต้องการอยู่วางไม่เหมือนกันแต่ละไฟล์


เช่น ข้อมูล บางไฟล์วางไว้ที่ A:2 บางไฟล์วางที่ A:5

ทำให้เราไม่สามารถ กำหนดได้เลยว่าเราจะเลือกตัดไปใส่ใน Database และข้อมูลมีทั้งหมดประมาณ 15 Field


เราจะทำการออกแบบอย่างไรให้สามารถจัดการกับข้อมูลเหล่านี้ และสามารถดึงข้อมูลมาใช้ได้อย่างง่ายขึ้น

27 ก.ย. 2553 3 1,562


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



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



1. ก่อนอื่นก็ต้องหาลักษณะเฉพาะตัวของฟิลดิ์ต่างๆออกมาก่อน เพื่อใช้ในการเขียนฟังก์ชั่นตรวจสอบ เช่น ฟิลดิ์ที่เก็บบัตรประชาชนก็ต้องมี 13 หลัก หรือฟิลดิ์ descript ก็น่าจะเป็นฟิลดิ์ที่ยาวพอสมควร (น่าจะมากกว่าชื่อ-นามสกุล) ฟิลดิ์ราคาก็น่าจะเป็นฟิลดิ์ที่มีตัวเลขพร้อมจุดทศนิยม เป็นต้น ถ้าทุกๆฟิลดิ์มีเอกลักษณ์เฉพาะตัวแตกต่างชัดเจนก็เป็นไปได้ที่จะผ่านได้ครับโปรเจคนี้

2. ขั้นตอนการนำเข้าก็ใช้ฟังก์ชั่นที่ใช้ตรวจสอบแต่ละแบบ (ถ้ามี 10 ฟิลดิ์ก็ 10 แบบ) ตรวจสอบทุกฟิลดิ์ก่อน เพื่อใช้ในการตัดสินใจว่าฟิลดิ์นั้นจะนำเข้า Database ฟิลดิ์ไหน สมมติฟิลดิ์แรกสามารถตรวจสอบได้ว่าเป็นเลข 13 หลักก็ตั้งค่าตัวแปรฟิลดิ์ที่ 1 เป็น cid ประมาณนี้ โดยการตรวจสอบอาจจะตรวสอบสัก 5-10 เรคคอร์ดก็ได้ตามความจำเป็น

3. เมื่อตรวสอบเรียบร้อยแล้วก็ import เข้า database ได้เลย



การใช้ฟังก์ชั่นตรวจสอบแบบนี้อาจจะต้องคำนึงถึง performance ของระบบด้วย ในตอนที่ผมทำนั้นมีการปรับเปลี่ยนข้อมูลภายในฟิลดิ์ด้วย


#1

คำถามดูแปลกๆนะ ลองขยายความนิดนึง



ผมไม่เข้าใจว่า 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

}

?>

#2


ไฟล์ 40 แบบใส่ตารางเดียวคับผม ซึ่งแต่ละ Colum ข้อมูลอยู๋ไม่เหมือนกันใน 40 ไฟล์ ที่เป็นปัญหาเพราะว่าลูกค้าส่งข้อมูลมาไม่เหมือนกัน รายละเอียดแค่คล้ายกันครับ



ขอบคุณทั้งสองท่านมากๆครับ พอดีผมก็คิดว่าจะทำแบบเช็คก่อนว่าข้อมูลตามเงื่อนไขหรือไม่ ถ้าใช่ก็เอาลง Database

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

 


#3
ความคิดเห็น
ไฟล์อัปโหลด ชนิด jpg, jpeg ขนาดไฟล์ไม่เกิน 1024
^