magento导入csv文件到数据库脚本
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 (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'] = 'zouhongzhao@126.com';
$customerData['country'] = 'Finland';
$customerData['password'] = self::randomkeys(10); & nbsp;
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 <<<USAGE
Usage: php tetuan_customer_import.php --file a.csv,b.csv
\n
USAGE;
}
}
// Instantiate
$shell = new Faarao_Import_Customer();
// Initiate script
$shell->run();
?>补充:有一些朋友使用的是excel文档,这样这个程序就不可以使用了,我们可以使用phpexcel插件来读取excel文件并写入到数据库中去哦。
文章地址:http://www.phprm.com/develop/64871.html
转载随意^^请带上本文地址!