Csv读写类

  1 <?php
  2 
  3 /**
  4  * CSV 文件读写类
  5  * 
  6  * 示例:
  7 
  8 $header = array('name' => '名字', 'age' =>'年龄', 'idcard' => '身份证号');
  9 
 10 $data = array(
 11     array('age' => 12, 'name' => '李四', 'idcard' => '42088751564616131312'),
 12     (object) array('idcard' => '72888751564616131312', 'age' => 17, 'name' => '张三'),
 13 );
 14 
 15 Csv::instance()->open('e:/abc1.csv', true)->header($heaer)->create($data)->close();
 16 Csv::instance()->open()->header($header)->create($data)->download('用户数据.csv');
 17 
 18  */
 19 
 20 class Csv {
 21 
 22     public $header = array();
 23 
 24     public $fp = '';
 25 
 26     public static function instance(){
 27         
 28         return new static();
 29     }
 30 
 31     /**
 32      * 打开/创建文件
 33      * @param string $file
 34      * @param string $mode
 35      * @return $this
 36      */
 37     public function open($file = '',  $mode = 'a'){
 38 
 39         if(empty($file)){
 40 
 41             $this->fp = tmpfile();
 42         }else{
 43             if($mode === true) $mode = 'w+';
 44             $this->fp = fopen(iconv('UTF-8', 'GBK', $file), $mode);
 45         }
 46 
 47         return $this;
 48 
 49     }
 50 
 51 
 52     /**
 53      * 写入表头
 54      * @param $value
 55      * @return $this
 56      */
 57     public function header($value){
 58 
 59         $this->header = is_array($value)? $value : (array) $value;
 60         fputcsv($this->fp, array_values($this->header));
 61         
 62         return $this;
 63     }
 64 
 65 
 66     /**
 67      * 写入一行
 68      * @param $data
 69      * @return $this
 70      */
 71     public function write($data){
 72 
 73         if(is_string($data)){
 74             $data = json_decode($data, true);
 75         }else if(!is_array($data)){
 76             $data = json_decode(json_encode($data), true);
 77         }
 78 
 79         if(empty($data)) return $this;
 80 
 81         if($this->header){
 82             $column = array();
 83             foreach($this->header as $key => $value){
 84                 $column[$key] = isset($data[$key])? $data[$key] : 'NULL';
 85             }
 86             $data = &$column;
 87         }
 88 
 89         foreach($data as $key => &$value){
 90             if(is_numeric($value) && strlen($value) > 10){
 91                  $value .= "\t";
 92             }else if(!is_scalar($value)){
 93                 $value = json_encode($value, JSON_UNESCAPED_UNICODE);
 94             }
 95             
 96         }
 97 
 98         fputcsv($this->fp, $data);
 99 
100         return $this;
101     }
102 
103     /**
104      * 读取一行
105      * @param int $length
106      * @param string $delimiter
107      * @param string $enclosure
108      * @param string $escape
109      * @return array|false|null
110      */
111     public function read($length = 0, $delimiter = ',', $enclosure = '"', $escape = '\\'){
112 
113         return fgetcsv($this->fp, $length, $delimiter, $enclosure, $escape);
114     }
115 
116 
117     /**
118      * 获取文件内容
119      * @param null $callback
120      * @param int $start
121      * @param int $length
122      * @return array
123      */
124     public function content($callback = null, $start = 1, $length = 0){
125 
126         if($start > 1){
127             for($start; $start > 1; $start--){
128                 $this->read(1);
129             }
130         }
131 
132         $data = array();
133         $key = 0;
134         while(($row = $this->read()) !== false){
135 
136             if($length < 0) break;
137             if($length > 0) $length--;
138 
139             if(is_callable($callback)){
140                 $row = $callback($row);
141                 if($row === null) continue;
142             }
143             $data[$key] = $row;
144             $key++;
145 
146         }
147 
148         return $data;
149     }
150 
151 
152     /**
153      * 下载
154      * @param $file
155      */
156     public function download($file){
157 
158         $file = iconv('UTF-8', 'GBK', $file);
159         header('Content-Type:application/application/octet-stream');
160         header("Content-Disposition:attachment;filename=$file");
161 
162         fseek($this->fp, 0);
163         echo stream_get_contents($this->fp);
164 
165         $this->close();
166 
167     }
168 
169 
170     /**
171      * 快速写入文件
172      * @param $data
173      * @return $this
174      */
175     public function create($data){
176 
177         if(is_string($data)) $data = json_decode($data, true);
178         foreach($data as $row){
179             $this->write($row);
180         }
181 
182         return $this;
183 
184     }
185 
186 
187     public function close(){
188 
189         fclose($this->fp);
190     }
191 
192 
193 }

 

posted @ 2018-09-10 21:34  心随所遇  阅读(401)  评论(0编辑  收藏  举报