2017-02-11 83 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'); 
        }