六月 25
[PHP]fgetcsv處理中文解決方案
使用fgetcsv取得csv檔資料時,中文首字元會有被截掉的問題,上PHP官網翻了一下,原來加上setlocale即可解決。
原本用PHP4沒出現這問題,大概是PHP5才會這樣吧...
Modify 2008-06-29:
PHP5透過PEAR作檔案上傳的動作時,若發生檔案名稱首位中文前半個字元被吃掉的問題時,用上述方式也可解決。
另外分享今天匯入csv檔時的寫法,因欄位太多,所以用直接抓取第一行當欄位名的方式塞陣列(方便產生SQL)。
$rows = 0;
while(($ar = fgetcsv($fp, 1000, ","))!=false) {
if ($rows!=0) {
foreach($ar as $k=>$v) {
$d['data'][$rows][$d['field'][$k]] = $v;
}
} else {
foreach($ar as $k=>$v) {
$d['field'][$k] = $v;
}
}
$rows++;
}
Array
(
[field] => Array
(
[0] => field1
[1] => field2
[2] => field3
)
[data] => Array
(
[1] => Array
(
[field1] => value1
[field2] => value2
[field3] => value3
)
[2] => Array
(
[field1] => value1
[field2] => value2
[field3] => value3
)
)
)
標籤: PHP
06-25 17:47@ 網頁設計 | 回應 | | 隱藏資訊列
意外逛到這裡, 這個code幫助我很大呀~
原本有個轉成Csv亂七八糟的excel檔...竟然就這樣一套就出來了,實在非常感謝你的分享
我用你說的設定,但是發現csv檔第一列的欄位名稱讀入有問題。第一列內容如下:
"姓名","性別","年齡","電話"
我讀入後用print_r($d['field']) dump結果發現
$d['field'][0]的值是 "姓名",而不是姓名。也就是那個括起來的雙引號也變成值的一部分。
後來下trim($d['field'][0],'\"')結果變成 "姓名,後來那個沒了但是前面那個雙引號還在。
我是用PHP 5.2.1。
最後用winhex去看檔案16進位內容,居然發現csv檔最前面三個bytes是EF,BB,BF。
請問你碰過這狀況嗎?要怎麼解決?
我找到原因了,因為UTF8 text file最前面會塞Begin of Mark(BOM),就是 EF BB BF三個字元,所以我用str_ireplace把他吃掉,再用trim($heading, '\"')就解決了。
請問如何用str_ireplace把他吃掉?
我用以下都不行:
$h = str_ireplace( 0xEFBBBF, 0x000000, $h);
$h = str_ireplace( 0xEFBBBF, 0x00, $h);
$h = str_ireplace( 0xEFBBBF, "", $h);
要怎麼解決?