使用csv在php中导入20k详细信息
我正在尝试插入一个至少有20k行的csv文件,它会提示我的浏览器自行关闭它,我猜它占用了大量内存,处理速度非常慢,我也在这样做是为了导出,但同样的问题是,浏览器要关闭它需要太多时间。你对我该如何使它更容易、更快有什么建议吗 这是我的密码: 进口:使用csv在php中导入20k详细信息,php,csv,Php,Csv,我正在尝试插入一个至少有20k行的csv文件,它会提示我的浏览器自行关闭它,我猜它占用了大量内存,处理速度非常慢,我也在这样做是为了导出,但同样的问题是,浏览器要关闭它需要太多时间。你对我该如何使它更容易、更快有什么建议吗 这是我的密码: 进口: if($_POST) { $error = 0; $tmpName = $_SESSION["csv_file"]; $fileExtension = $_SESSION["csv_ext"];
if($_POST) {
$error = 0;
$tmpName = $_SESSION["csv_file"];
$fileExtension = $_SESSION["csv_ext"];
$fieldset = explode(",", trim($_REQUEST["csv_listfields"], ","));
unset($_SESSION["csv_file"]); unset($_SESSION["csv_ext"]);
if($tmpName){
if($fileExtension == 'csv'){
$fp = fopen($tmpName, 'r');
$fr = fread($fp, filesize($tmpName));
$line = explode("\n", $fr);
$field_pairs = array();
$csvpos=array();
$csvpos=$_POST['csv_pos'];
$getCsvPos=array();
$ifNotempty=0;
for($i=0;$i<count($csvpos);$i++){
if($csvpos[$i]!=-1){
$getCsvPos[$ifNotempty] = $csvpos[$i];
$ifNotempty++;
}
}
$fldcolumns = $line[0];
$fldcolumns = array_map("trim_field", explode(",", $fldcolumns));
$forIndexValue=0;
foreach($fieldset as $fld){
$f = explode("=", $fld);
list($dbcol, $colcsv) = explode("=",$fld);
$field_pairs[$dbcol] = $getCsvPos[$forIndexValue] ;
$forIndexValue++;
}
$csvfile = fopen($tmpName, 'r');
$ctr = 0;
$total_uploaded = 0;
while (($datax = fgetcsv($csvfile, 1000, ",")) !== FALSE) {
$insert_crm = array();
$row_hascrm_assigned = false;
if($ctr != 0){
$ins_tbl = array();
$has_val = false;
foreach($field_pairs as $field => $colkey){
if( $datax[$colkey] != '' ) $has_val = true;
if($field != 'crm_group'){
if($field == 'password'){
$ins_tbl[$field] = (strlen($datax[$colkey]) != 64) ? hash("sha256", $datax[$colkey]) : $datax[$colkey];
}elseif($field == 'birthdate' || $field == 'dateIN'){
if($field=="dateIN"){
if($datax[$colkey] == ""){
$date = date("Y-m-d");
}else{
$date = $datax[$colkey];
}
$ins_tbl[$field] = $date;
}
}elseif($field == 'email'){
$ins_tbl[$field] = strtolower($datax[$colkey]);
}else{
$ins_tbl[$field] = mysql_real_escape_string($datax[$colkey]);
}
if($field != "dateIN"){
$ins_tbl["dateIN"] = date("Y-m-d");
}
if($field == "birthdate"){
$ins_tbl[$field] = $datax[$colkey];
}
}else{
foreach( explode(";", $datax[count($fldcolumns) - 1]) as $cg ){
$cg = ($cg == "")?$datax[$colkey]:$cg;
$cg = htmlentities($cg);
$crm_sql = mysql_query("SELECT crm_gid FROM tbl_crm_groups WHERE crm_group_name = '".trim($cg, "'")."'");
if(mysql_num_rows($crm_sql) < 1){
mysql_query("INSERT INTO tbl_crm_groups (crm_group_name, crm_date_created, custom) VALUES ('".$cg."', '".date('Y/m/d H:i:s')."', 1)") or die("</br>Error Message: ".mysql_error());
$crm_gid = mysql_insert_id();
}else{
$crm_gid = ($cg != "" && mysql_num_rows($crm_sql) > 0) ? mysql_result($crm_sql, 0) : 1;
}
if(mysql_num_rows(mysql_query("SELECT * FROM tbl_crm_members WHERE crm_groupid = {$crm_gid} AND crm_uid = {$crm_uid}")) < 1){
if(!in_array("INSERT INTO tbl_crm_members(crm_groupid, crm_uid, datejoined) VALUES('{$crm_gid}', '[give_me_uid]', '".date("Y-m-d")."')", $insert_crm))
$insert_crm[] = "INSERT INTO tbl_crm_members(crm_groupid, crm_uid, datejoined) VALUES('{$crm_gid}', '[give_me_uid]', '".date("Y-m-d")."')";
}
}
}
}
if($has_val){
if(mysql_query("INSERT INTO tbl_members (".implode(',',array_keys($ins_tbl)).") VALUES (\"".implode('","',$ins_tbl)."\")")){
$last_member_inserted = mysql_insert_id();
$total_uploaded++;
if(count($insert_crm) > 0){
foreach($insert_crm as $ic){
mysql_query( str_replace("[give_me_uid]", $last_member_inserted, $ic) );
}
}else{
mysql_query( "INSERT INTO tbl_crm_members(crm_groupid, crm_uid, datejoined) VALUES('1', ".mysql_insert_id().", '".date("Y-m-d")."')" );
}
}
}
}
$ctr++;
}
fclose($fp);
echo "<div style='color: green; margin: 10px;'>STATUS: ".$total_uploaded." record(s) successfully imported. <br/>This page will reload in a couple of seconds.</div>";
}else{
exit("Not a valid csv file uploaded.");
}
unlink($tmpName);
echo "<script type='text/javascript'>setTimeout(function(){parent.location.reload(true);}, 2000);</script>";
}else{
exit("File uploaded improperly.");
}
}
使用MySQL导入功能,让数据库负责导入。速度要快得多
LOAD DATA LOCAL INFILE '/some/file/path'
INTO TABLE table_name
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
它一定是因为explode()函数而发生的。(对不起,无法抗拒)这就是你应该做的using@Gigi我想让它有一个BOOM@Dagon我想你可以帮我一把,不太熟悉的可以用一个更实际的解释,如果你觉得合适的话,一些示例也会很好:)$sql\u getcustomers=$\u POST['val'];但这将在没有任何验证的情况下插入?我倾向于导入临时表,然后从中读取,复制我需要的内容。一旦我处理完数据,我就可以刷新表,准备进行另一次导入。然后我可以在那里创建一个新的表导入吗?提取数据并进行验证,然后导入真正的表?但这不会花费更多的时间吗?加载数据是如何工作的?非常感谢。
LOAD DATA LOCAL INFILE '/some/file/path'
INTO TABLE table_name
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
IGNORE 1 LINES