magento导入csv文件到数据库方法我们会使用到一个插件了SplFileObject,利用SplFileObject可以实现大数据量导入了,当然我们自己写得也是可以的,但是不一定比这个要好呀.
这是magento脚本的另外一种写法,个人觉得写的还行,高手莫见笑,用SplFileObject来处理大数据的csv文件效率高,代码如下:
- <?php
- 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(emptyempty($this->_files)){
- die(self::usageHelp());
- }
- }
-
- public function run() {
- self::getDataFromCsv();
- if(emptyempty($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(emptyempty(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(emptyempty($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['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();
-
- 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->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);
- }
-
- }
- echo "import num: {$importNum} =======================\r\n";
- }
-
- $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){
-
- 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){
-
- 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);
-
- file_put_contents($filename, $content);
-
-
-
- $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));
-
-
-
- array_push($tmp,$mergeValue);
- }
-
- $this->_datas[$basename] = $tmp;
- }
- return $this;
- }
-
- public function get_extension($filename){
- return pathinfo($filename,PATHINFO_EXTENSION);
- }
-
- public function usageHelp()
- {
- return <<<USAGE
- Usage: php tetuan_customer_import.php --file a.csv,b.csv
- \n
- USAGE;
- }
- }
-
- $shell = new Faarao_Import_Customer();
-
- $shell->run();
补充:有一些朋友使用的是excel文档,这样这个程序就不可以使用了,我们可以使用phpexcel插件来读取excel文件并写入到数据库中去. |