標籤:ref each obj 中文字元 有一個 integer ram 亂碼問題 編碼
php 匯入/匯出 csv 檔案
1、簡介
項目開發中,很多時候要將外部CSV檔案匯入到資料庫中或者將資料匯出為CSV檔案,那麼具體該如何?呢?本文將使用原生PHP,實現了CSV格式資料的匯入和匯出功能。並解決相關亂碼問題。
將xls轉換成csv的文字格式設定,然後再用php分析這個檔案,和PHP分析文本沒有什麼區別。
優點:跨平台,效率比較高、可以讀寫。
缺點:只能直接使用csv的檔案,如果經常接受.xls二進位檔案的話需要手工轉換,不能自動化。一個檔案只有一個SHEET。
2、相關函數介紹
2.1、fgetcsv
參考:http://www.w3school.com.cn/php/func_filesystem_fgetcsv.asp
2.2、fputcsv
參考:http://www.w3school.com.cn/php/func_filesystem_fputcsv.asp
2.3、fopen
參考:http://www.w3school.com.cn/php/func_filesystem_fputcsv.asp
2.4、iconv
參考:http://php.net/manual/fr/function.iconv.php
本次大致會使用以上4個函數,實現csv檔案的匯入匯出
3、如何匯出csv檔案
註:預設匯出是utf8編碼,需要對字串進行轉碼,excel 開啟檔案預設是gbk編碼,所以utf8匯出在txt檔案開啟是正常,在excel開啟是亂碼
3.1、測試utf8匯出
匯出的資料格式
$head = array(‘編號‘,‘姓名‘,‘年齡‘,‘出生年月‘);$data = array(array(‘001‘,‘zs‘,10,‘1991-1-1‘),array(‘002‘,‘李四‘,10,‘1991-1-1‘),array(‘003‘,‘王五‘,10,‘1991-1-1‘),);$obj->putCsv(‘putCsv.csv‘, $data, $head);
匯出的方法:
class Excel{/** * [putCsv description] * @param string $csvFileName [description] 檔案名稱 * @param array $dataArr [description] 數組,每組資料都是使用,分割的字串 * @param string $haderText [description] 標題(預設第一行) * @param integer $line [description] 從第幾行開始寫 * @param integer $offset [description] 共計寫幾行 * @return [type] [description] */public function putCsv($csvFileName, $dataArr ,$haderText = ‘‘, $line = 0, $offset = 0){$handle = fopen($csvFileName,"w");//寫方式開啟if(!$handle){return ‘檔案開啟失敗‘;}//判斷是否定義頭標題if(!empty($haderText)){$re = fputcsv($handle,$haderText);//該函數返回寫入字串的長度。若出錯,則返回 false。。}foreach ($dataArr as $key => $value) {$re = fputcsv($handle,$value);//該函數返回寫入字串的長度。若出錯,則返回 false。。}}}
運行結果:
找到產生的csv檔案,先使用記事本開啟;
編碼和內容都正常,唯一的不足就是沒有自動換行;
在使用excel開啟
因為excel預設開啟是gbk編碼,所以亂碼,可以使用記事本改編碼為ANSI格式
3.2、提前對中文進行轉碼匯出
<?phpclass Excel{/** * [putCsv description] * @param string $csvFileName [description] 檔案名稱 * @param array $dataArr [description] 數組,每組資料都是使用,分割的字串 * @param string $haderText [description] 標題 * @return [type] [description] */public function putCsv($csvFileName, $dataArr ,$haderText = ‘‘){$handle = fopen($csvFileName,"w");//寫方式開啟if(!$handle){return ‘檔案開啟失敗‘;}//判斷是否定義頭標題if(!empty($haderText)){foreach ($haderText as $key => $value) {$haderText[$key] = iconv("utf-8","gbk//IGNORE",$value);//對中文編碼進行處理}$re = fputcsv($handle,$haderText);//該函數返回寫入字串的長度。若出錯,則返回 false。。}foreach ($dataArr as $key => $value) {foreach ($value as $k => $v) {$value[$k] = iconv("utf-8","gbk//IGNORE",$v);//對中文編碼進行處理}$re = fputcsv($handle,$value);//該函數返回寫入字串的長度。若出錯,則返回 false。。}}}
匯出結果:
這樣處理,不管在txt文本還是excel中都是正常的。不會出現亂碼
4、匯入csv檔案
匯入csv檔案也需要對中文進行轉碼處理
/** * [getCsv description] 匯出csv檔案 * @param string $csvFileName [description] 檔案名稱 * @param integer $line [description] 讀取幾行,預設全部讀取 * @param integer $offset [description] 從第幾行開始讀,預設從第一行讀取 * @return [type] [description] */public function getCsv($csvFileName, $line = 0, $offset = 0){$handle = fopen($csvFileName,‘r‘);//開啟檔案,如果開啟失敗,本函數返回 FALSE。if(!$handle){return ‘檔案開啟失敗‘;}//fgetcsv() 出錯時返回 FALSE,包括碰到檔案結束時。$i = 0;//用於記錄while的迴圈次數,方便與$line,$offset比較$arr = array();//結果的存放數組while($data = fgetcsv($handle)){//小於位移量則不讀取,但$i仍然需要自增if($i < $offset && $offset){$i++;continue;}//大於讀取行數則退出if($i > $line && $line){break;}$i++;foreach ($data as $key => $value) {$content = iconv("gbk","utf-8//IGNORE",$value);//轉化編碼$arr[] = $content;//至於如何處理這個結果,需要根據實際情況而定}}return $arr;}
csv匯入資料是一格一格讀取,所以在處理過程中相對麻煩,需要提前知道一行有幾列,因為是測試,所以沒有對結果進行特殊的處理。
5、總結
注意匯入和匯出的過程中,遇到中文字元一定要記得轉碼,否則可能會出現中文亂碼的情況。
csv檔案的匯入匯出相對於xls檔案操作容易。
原文地址:http://www.cnblogs.com/ImCehnyx/p/7198139.html
php 匯入/匯出 csv 檔案