背景
最近公司给到一张上千万的爬虫数据,需要把数据整理后导入数据库。
-
- csv处理的核心代码
/**
* @param int $offset 导入起始行数
* @param string $fileName 导入的文件
* @param int $lines 导入行数
* @return array|bool
*/
public function importCvs($offset=0,$fileName='digikey_sample_1000_0922',$lines=1000)
{
$csvfile = base_path() . "/" .$fileName .".csv";//文件路径
if (!$fp = fopen($csvfile, 'r')) {
return false;
}
$i = $j = 0;
while (($line = fgets($fp)) !==false) {
if ($i++ < $offset) {
continue;
}
break;
}
$data = array();
while (($j++ < $lines) && !feof($fp)) {
if($info = fgetcsv($fp)){
foreach ($info as $key => $item) {
$info[$key] = iconv("GBK", "UTF-8", $item);//这里必须转码,不然会乱码
}
$data[] = $info;
}
}
fclose($fp);
// dd($data);
return $data;
}
- 2.业务数据处理
/**
* 数据处理
*/
public function importCsvToDb()
{
$j = 0;
$line = 1000;//批量数
for ($i=1;$i<13500;$i++){
$data = $this->importCvs($j,'digikey_sample_1000_0922',$line);
//TODO 插入数据库
if(!$data) break;
$fields = ['url','category1','category2','category3','category4','categories','name','image','part_number','manufacturer','manufacturer_number','detailed_description','description','manufacturer_standard_leadtime','detail_description','datasheet_url','in_stock','factory_stock','marketplace_stock','price','product_attributes','environmental','additional_resources','updated'];
$insert = [];
if(is_array($data)){
foreach ($data as $key=> $value){
foreach ($value as $k => $v){
if(isset($fields[$k])) $insert[$key][$fields[$k]] = $v;
}
}
}
if($insert){
$ret = (new LcscDigikeyModel())->insert($insert);
}
$insert && $ret = (new LcscDigikeyModel())->insert($insert);
var_dump('------$j---------');
var_dump($j);
var_dump('------cnt---------');
var_dump(count($data));
var_dump('---ret--');
var_dump($ret);
var_dump("<pre><pre>");
unset($insert,$data);
$j = $line * $i;
}
dd('end successful');
}