这是magento脚本的另外一种写法。
个人觉得写的还行,高手莫见笑。
用SplFileObject来处理大数据的csv文件效率高
代码如下 | 复制代码 |
require_once 'shell/abstract.php'; class Faarao_Import_Customer extends Mage_Shell_Abstract { protected $_files = array(); protected $_datas = array(); public function __construct() { parent::__construct(); set_time_limit(0); if($this->getArg('file')) { $this->_files = array_merge( $this->_files, array_map( 'trim', explode(',', $this->getArg('file')) ) ); foreach ($this->_files as $key=>$file) { $extension = self::get_extension($file); if($extension != 'csv'){ unset($this->_files[$key]); } } } if(empty($this->_files)){ die(self::usageHelp()); } } // Shell script point of entry public function run() { self::getDataFromCsv(); if(empty($this->_datas)){ die("not found data in csv ! \r\n"); } $emailBooks = array(); foreach ($this->_datas as $name => $datas) { echo "filename: {$name} =======================\r\n"; $importNum = 0; foreach ($datas as $key => $data) { if(empty(trim($data[4]))){ continue; } $customerData['firstname'] = trim($data[0]); $customerData['lastname'] = trim($data[1]); $customerData['phone'] = trim($data[2]); $customerData['mobile'] = trim($data[3]); $customerData['email'] = trim($data[4]); $customerData['company'] = trim($data[5]); $customerData['billing_address'] = $data[6] . $data[7] . $data[8]; $customerData['billing_postcode'] = sprintf("%05d",trim($data[9])); $customerData['billing_city'] = trim($data[10]); $customerData['billing_country'] = trim($data[11]); $customerData['shipping_address'] = $data[12] . $data[13] .$data[14]; if(empty($data[15]) && is_numeric($data[16])){ $customerData['shipping_postcode'] = sprintf("%05d",trim($data[16])); $customerData['shipping_city'] = trim($data[17]); $customerData['shipping_country'] = trim($data[18]); }else{ $customerData['shipping_postcode'] = sprintf("%05d", trim($data[15]));; $customerData['shipping_city'] = trim($data[16]); $customerData['shipping_country'] = trim($data[17]); } // $customerData['email'] = '[email protected]'; $customerData['country'] = 'Finland'; $customerData['password'] = self::randomkeys(10); echo "customer email {$customerData['email']} ...\r\n"; print_r($customerData); $customer = Mage::getModel('customer/customer'); $customer->setWebsiteId(Mage::app()->getWebsite()->getId()); $customer->loadByEmail($customerData['email']); if(!$customer->getId()) { echo "insert ... \r\n"; $customer->setEmail($customerData['email']); $customer->setFirstname($customerData['firstname']); $customer->setLastname($customerData['lastname']); $customer->setPassword($customerData['password']); }else{ echo "update ... \r\n"; } try { $customer->save(); $customer->setConfirmation(null); $customer->save(); //Make a "login" of new customer Mage::getSingleton('customer/session')->loginById($customer->getId()); $importNum ++; $emailBooks[$customerData['email']] = array( 'firstname'=>$customerData['firstname'], 'lastname'=>$customerData['lastname'], 'customer_mage_id'=>$customer->getId(), 'passwd'=>$customerData['password'] ); echo "customer save ok !\r\n"; } catch (Exception $ex) { echo "customer save fail !\r\n"; continue; } if(trim($customerData['billing_address']) == trim($customerData['shipping_address']) && $customerData['billing_postcode'] == $customerData['shipping_postcode'] && $customerData['billing_city'] == $customerData['shipping_city']){ $same_address = array ( 'firstname' => $customerData['firstname'], 'lastname' => $customerData['lastname'], 'street' => $customerData['billing_address'], 'company' => $customerData['company'], 'city' => $customerData['billing_city'], 'region_id' => '', 'region' => '', 'postcode' => $customerData['billing_postcode'], 'country_id' => 'FI', 'telephone' => $customerData['phone'], ); $customAddress = Mage::getModel('customer/address'); //$customAddress = new Mage_Customer_Model_Address(); $customAddress->setData($same_address) ->setCustomerId($customer->getId()) ->setIsDefaultBilling('1') ->setIsDefaultShipping('1') ->setSaveInAddressBook('1'); try { $customAddress->save(); echo "sameAddress save ok !\r\n"; } catch (Exception $ex) { echo "sameAddress save fail !\r\n"; continue; } }else{ $billing_address = array ( 'firstname' => $customerData['firstname'], 'lastname' => $customerData['lastname'], 'street' => $customerData['billing_address'], 'company' => $customerData['company'], 'city' => $customerData['billing_city'], 'region_id' => '', 'region' => '', 'postcode' => $customerData['billing_postcode'], 'country_id' => 'FI', 'telephone' => $customerData['phone'], ); self::setBillingAddress($billing_address,$customer); $shipping_address = array ( 'firstname' => $customerData['firstname'], 'lastname' => $customerData['lastname'], 'street' => $customerData['shipping_address'], 'company' => $customerData['company'], 'city' => $customerData['shipping_city'], 'region_id' => '', 'region' => '', 'postcode' => $customerData['shipping_postcode'], 'country_id' => 'FI', 'telephone' => $customerData['phone'], ); self::setShippingAddress($shipping_address,$customer); } // die; } echo "import num: {$importNum} =======================\r\n"; } //save passwd $fp = fopen('customer_record.log', 'w'); fwrite($fp, json_encode($emailBooks)); fclose($fp); } public function setBillingAddress($data,$customer){ $customerAddress = Mage::getModel('customer/address'); if ($defaultShippingId = $customer->getDefaultBilling()){ $customerAddress->load($defaultShippingId); } else { $customerAddress ->setCustomerId($customer->getId()) ->setIsDefaultBilling('1') ->setSaveInAddressBook('1') ; $customer->addAddress($customerAddress); } try { $customerAddress ->addData($data) ->save() ; echo "BillingAddress save ok !\r\n"; } catch(Exception $e){ // Mage::log('Address Save Error::' . $e->getMessage()); echo "BillingAddress save fail !\r\n"; } } public function setShippingAddress($data,$customer){ $customerAddress = Mage::getModel('customer/address'); if ($defaultShippingId = $customer->getDefaultShipping()){ $customerAddress->load($defaultShippingId); } else { $customerAddress ->setCustomerId($customer->getId()) ->setIsDefaultShipping('1') ->setSaveInAddressBook('1') ; $customer->addAddress($customerAddress); } try { $customerAddress ->addData($data) ->save() ; echo "ShippingAddress save ok !\r\n"; } catch(Exception $e){ // Mage::log('Address Save Error::' . $e->getMessage()); echo "ShippingAddress save fail !\r\n"; } } public function randomkeys($length) { $returnStr=''; $pattern = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLOMNOPQRSTUVWXYZ'; for($i = 0; $i < $length; $i ++) { $returnStr .= $pattern {mt_rand ( 0, 61 )}; } return $returnStr; } public function getDataFromCsv(){ $this->_files = array_unique($this->_files); $csvCustomers = array(); foreach ($this->_files as $filename) { echo "current file: {$filename}\r\n"; setlocale(LC_ALL, 'en_US.UTF-8'); $content = file_get_contents($filename); $data = mb_detect_encoding()($content, 'UTF-8', true); // $data = iconv("CP1257","UTF-8", $content); file_put_contents($filename, $content); // fclose($handle); // print_r($content);die; $basename = basename($filename,".csv"); $data = array(); $tmp = array(); $spl_object = new SplFileObject($filename, 'rb'); $spl_object->seek(filesize($filename)); $start = 0; $num = $spl_object->key(); $spl_object->seek($start); while ($num-- && !$spl_object->eof()) { $data[] = $spl_object->fgetcsv(); $spl_object->next(); } foreach ($data as $key => $values) { if($key == 0){ continue; } $mergeValue = explode(';',implode(';', $values)); // if(count($mergeValue) != 20){ // continue; // } array_push($tmp,$mergeValue); } $this->_datas[$basename] = $tmp; } return $this; } public function get_extension($filename){ return pathinfo($filename,PATHINFO_EXTENSION); } // Usage instructions public function usageHelp() { return << \n USAGE; } } // Instantiate $shell = new Faarao_Import_Customer(); // Initiate script $shell->run(); |
补充:有一些朋友使用的是excel文档,这样这个程序就不可以使用了,我们可以使用phpexcel插件来读取excel文件并写入到数据库中去哦。