2017-02-11 126 views
0

我正在开发一个应用程序,它必须读取大型CSV文件和处理数据。绝对不可能在一个请求中完成它,因为处理数据也需要时间,而不仅仅是阅读。PHP:如何阅读使用AJAX请求的部分CSV文件

所以我试过到目前为止,什么一直运作良好,到目前为止是这样的:

// Open file 
$handle = fopen($file, 'r'); 

// Move pointer to a place where it stopped last time 
fseek($handle, $offset); 

// Read limited line and process 
for ($i = 0; $i < $limit; $i++) { 
    // Get length of line for offset purposes 
    $newlength = strlen(fgets($handle)); 

    // Move pointer back. fgets moves pointer so we move it back for fgetcsv to get that line again 
    fseek($handle, $offset); 

    $line = fgetcsv($handle, 0, $csv_delimiter); 

    // Process data here 

    // Save offset 
    $offset += $newlength; 
} 

所以,问题就在这里在这条线:

$newlength = strlen(fgets($handle)); 

它失败时CSV列有换行符。

我也试过$newlength = strlen(implode(';', fgetcsv($handle, 0, $csv_delimiter)));但这并不总是奏效。通常几个字符都会失败。大概的报价和行尾在这里处理不当。

我所需要的只是获取csv行的长度,不仅仅是单行,而是可能在引号内有换行符的csv行。

有人有更好的解决办法吗?

+0

我会将作业发送到作业队列,并让计划程序(如cron)定期从命令行处理这些作业。并在工作完成时向适当的人发送通知。 – jeroen

+0

这与我的问题无关。克朗将接下来。首先,我需要更正脚本来处理数据。 – Jamol

回答

2

做一两件事,创建一个名为“my_csv_data”一个MySQL的临时表,该表与在csv文件和额外的所有字段添加一个字段添加一个“is_processed”与枚举(0,1)默认值'0'。

现在将您的所有csv数据导入到该sql表中。它永远不会花费更多时间进行单个插入。

现在提交一个访问my_csv_data表的10个函数/文件或100个记录is_processed ='0'的地方并处理它,并且如果进程成功完成,则将“is_processed”字段更新为'1'。

现在创建一个命中该文件/函数的cronjob。定期。

使用这种方式,数据将静默插入您的表中,而不会打扰/遭受任何管理员/前端用户。

0

我有Codeignitor代码,我上传CSV文件数据并将其插入到MySQL数据库。希望这将帮助你

if($_FILES["file"]["size"] > 0) 
        { 
         $file = fopen($filename, "r"); 
         while (($emapData = fgetcsv($file, 10000, ",")) !== FALSE) 
         { 

           $data = array(
            'reedumption_code' => $emapData[0], 
            'jb_note_id' =>$jbmoney_id, 
            'jbmoney' =>$jbamount, 
            'add_date'=>time(), 
            'modify_date'=>time(), 
            'user_id'=>0, 
            'status'=>1, 
            'assign_date'=>0, 
            'del_status'=>1, 
            'store_status'=>1 
           ); 
          $this->load->model('currency_model'); 
          $insertId = $this->currency_model->insertCSV($data); 
         } 
         fclose($file); 
         redirect('currency/add_currency?msg=Data Imported Successfully'); 
        }