PHP CSV นำข้อมูลเข้า MS-Access ก่อนอื่นก็ขอขอบคุณเพื่อนๆ ใน thaicreate ที่ช่วยๆ กันถาม-ตอบ กันนะคะ
ก่อนอื่นก็ขอขอบคุณเพื่อนๆ ใน thaicreate ที่ช่วยๆ กันถาม-ตอบ กันนะคะ ได้ความรู้มาเยอะเลยค่ะ
(ส่วนตัวเองตอบคนอื่นไปน้อยเพราะความรู้ยังไม่เข้าขั้น จะพัฒนาฝีมือตัวเองต่อไปค่า แล้วจะตอบเยอะๆ มั่ง)
วันนี้มาขอคำปรึกษาค่ะ เรื่องการนำข้อมูลเข้าจากไฟล์ CSV มาค่ะ
จากไฟล์ CSV ที่นำข้อมูลเข้า บรรทัดแรกเป็นชื่อ Field ซึ่งเป็นชนิด text ทั้งหมด
เวลานำข้อมูลเข้าแล้ว จากโค้ด มันจะ RUN ทุกบรรทัด ทำให้เกิด error
ซึ่ง field ที่เก็บข้อมูลมีชนิดที่เป็น number ด้วย (เกิด type mismatch เวลา execute sql statement)
Code (PHP)
<?
while (($objArr = fgetcsv($objCSV, 1000, ",")) !== FALSE) {
$strSQL = "INSERT INTO offer ";
$strSQL .="(REF,NUM_DAY_PAST,STM_CYCLE,sumpri,prefix,lastname, firstname,oa_code,legal_status,M1,M2,M3,Period,flag_28, flag_62,msg_add_d,Deviate)";
$strSQL .=" VALUES ";
$strSQL .="('".$objArr[1]."','".$objArr[4]."','".$objArr[5]."' ";
$strSQL .=",'".$objArr[6]."','".$objArr[7]."','".$objArr[8]."' ";
$strSQL .=",'".$objArr[9]."','".$objArr[10]."','".$objArr[11]."' ";
$strSQL .=",'".$objArr[12]."','".$objArr[13]."','".$objArr[14]."' ";
$strSQL .=",'".$objArr[17]."','".$objArr[18]."','".$objArr[19]."' ";
$strSQL .=",'".$objArr[20]."','".$objArr[21]."')";
$rs=odbc_exec($conn,$strSQL) ;
if (!$rs){exit("Error in strSQL");}
}
?>
อยากถามว่า
1. พอจะมีวิธีเขียนให้ ข้ามบรรทัดแรกไปได้ไหมคะ
หรือไม่มี ต้องลบชื่อ Field ออกทางเดียว
เพราะข้อมูลที่นำเข้ามา เป็นไฟล์มาจากแผนกอื่นอีกทีนึง
2.ข้อมูลที่นำเข้ามีไม่แน่นอนค่ะ 800-1100 รายการแล้วแต่เดือนค่ะ
จะเขียนโค้ดยังไงดีคะ
รบกวนผู้รู้ทีนะคะ ขอบคุณค่ะTag : - - - -
Date :
2009-05-13 21:29:01
By :
poong
View :
1350
Reply :
5
เอ่อตรง
while (($objArr = fgetcsv($objCSV, 1000 , ",")) ใช่จำนวนเรคคอร์ดรึเปล่าคะ
ลองรายการต่ำกว่า 1000 รายการไม่มีปัญหาค่ะ
ถ้าอย่างนั้นเปลี่ยนเป็น 1100 ก็จะรับได้ 1100 รายการ
เข้าใจถูกรึเปล่าคะ
Date :
2009-05-14 00:01:16
By :
poong
ตรงนั้นเป็น lenth ของตัวอักษร ของบรรทัดยาวที่สุดในไฟล์
ไม่เกี่ยวกับจำนวนแถว ผมเข้าใจถูกเปล่าหว่า ยิ่งโง่ภาษาประกิตอยู่ด้วย
Date :
2009-05-14 00:09:38
By :
plakrim
<?php
$row = 1;
$handle = fopen("test.csv", "r");
while (($data = fgetcsv($handle, 65536, ",")) !== FALSE) {
if($row === 1){
$row++;
continue;
}
$num = count($data);
if($num == 0){
break;
}
echo "<p> $num fields in line $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
echo $data[$c] . "<br />\n";
}
}
fclose($handle);
?>
ใส่ไปเป็น 65536 ไปเลยครับเพราะมันเป็นจำนวนแถวที่ excel จะบันถึกได้ครับ
Date :
2009-05-14 00:16:14
By :
windersun
เรื่อง length เข้าใจแล้วค่ะ ขอบคุณทุกคนค่ะ
แต่ยังมีปัญหาเดิมค่ะ นี่ตัวอย่างข้อมูลในไฟล์ csv
prefix,firstname,lastname,age,occupation
miss,kanda,wandee,45,housewife,
mister,mana,yuuyen,30,manager
จะเห็นว่าชุดแรกจะเป็นตัวอักษรทั้งหมด พอรันโค้ดมันก็เกิด error
เพราะว่าอายุเก็บเป็นชนิด number
แต่พอโค้ดรันไป ก็จะเก็บบรรทัดแรกไป ทำให้ type mismatch
พอจะมีการเขียนโค้ดแบบไหนให้ข้ามบรรทัดแรกไปหรือเปล่าคะ
เพราะว่าที่เคยทำใน excel มันจะใช้คำสั่ง
for($i=2;$i<=5;$i++){
If(trim($xlSheet1->Cells->Item($i,1)) != "")
{
$strSQL = "";
$strSQL .= "INSERT INTO customer2 ";
$strSQL .= "(CustomerID,Name)";
$strSQL .= "VALUES ";
$strSQL .= "('".$xlSheet1->Cells->Item($i,1)."','".$xlSheet1->Cells->Item($i,2)."')";
} มันใช้ตัวแปร i เป็นตัวรัน เรคคอร์ด
แต่ใน csv ที่ทำไม่รู้วิธีอ่ะค่ะ
โค้ดที่เคยเขียนไปแล้วแก้แบบคุณ plakrim บอกแล้วค่ะ แต่มันก็ไม่ได้ค่ะ รบกวนทีนะคะ
<?
$i==0
while (($objArr = fgetcsv($objCSV, 1000, ",")) !== FALSE) {
if($i==0){
$i++;
continue;
}
$strSQL = "INSERT INTO offer ";
$strSQL .="(REF,NUM_DAY_PAST) VALUES ";
$strSQL .="('".$objArr[1]."','".$objArr[4]."')'";
$rs=odbc_exec($conn,$strSQL) ;
if (!$rs){exit("Error in strSQL");}
$i++; //ตัวแปร i รู้สึกจะไม่ได้ใช้ดูบรรทัดอ่ะค่ะ คือไม่รู้ว่าเข้าใจอะไรผิดไปรึเปล่าค่ะ
}
?>
ใครพอมีวิธีเขียนโค้ดแบบอื่นช่วยแนะทีค่ะ งานส่งดึกนี้แล้วค่ะ รบกวนด้วยจริงๆค่ะ ติดอยู่ตัวเดียวจริงๆ
Date :
2009-05-14 16:17:10
By :
poong
Load balance : Server 02