2010-07-19 123 views
2

我有很多文本文件需要打開,然後分配特定的字段來設置PHP中的字符串,最終寫入MySQL。如何並行讀取多個文件?

每個txt文件確實有APP_ID相同的唯一值,例如

所以文本文件1具有

APP_ID 名 描述

文本文件2具有

APP_ID 類別

文本文件3有

APP_ID 價格

我想每個記錄名稱,描述,類別和價格,並編寫到MySQL。

我可以閱讀使用代碼的第一個:

$fp = fopen('textfile1','r'); 
if (!$fp) {echo 'ERROR: Unable to open file.</table></body></html>'; exit;} 
while (!feof($fp)) { 
$line = stream_get_line($fp,4096,$eoldelimiter); 
if ($line[0] === '#') continue; //Skip lines that start with # 
$field[$loop] = explode ($delimiter, $line); 
list($app_id, $name, $description) = explode($delimiter, $line); 
$fp++; 
} 

fclose($fp); 
?> 

我的問題是如何讀取第二和第三文件?我可以以某種方式並行執行,或者我需要完成讀取文本文件1,將每行寫入mysql,然後打開文本文件2,然後使用app_id鍵上的替換將類別寫入mysql,然後執行與文本文件3打開相同的操作和?

+0

PHP是功能性的語言在這個環節做的PHP看看並行:http://home.jayhaabee.nl/trac/ 或 HTTP://dev.juokaz。 com/php/parallel-processes-in-php – 2010-07-19 13:11:43

回答

0

我推薦以下方法:

  • 創建包含以下字段的一個簡單的類:名稱,描述,類別和價格
  • 創建一個空的陣列將與APP_ID進行索引,每個對應於上述類
  • 的實例讀取每個文件並將結果影響到正確的元件陣列中

    if (!isset($array[$app_id])) $array[$app_id] = new MyClass();

    array[$app_id]->name = $name;

    array[$app_id]->description = $description;

  • 一旦你閱讀完所有的文件,您可以通過遍歷數組和寫入每個元素的SQL表。

+0

這可以工作,但是用這個解決方案你需要緩衝數據。這並不是必須的,他可以一次打開三個文件並遍歷所有這些文件。 – JeSuisse 2010-07-19 13:28:22

0

只需打開所有這三個文件的順序,然後有三個stream_get_line在while循環,每一個文件:

$ FP1 =的fopen( 'textfile1', 'R');

$ fp2 = fopen('textfile2','r');

$ fp3 = fopen('textfile3','r');

而(!FEOF(FP1 $)){

$一號線= stream_get_line($ FP1 ...)

$ 2號線= stream_get_line($ FP2 ...)

$ 3號線= stream_get_line($ FP3 ...)

...

你必須要小心,儘管如此,每個文件的行數都完全相同。最好的 可能會在每個流中檢查feof,然後再從中讀取一行,如果其中一個流在其他行之前耗盡,則會中止並顯示一條錯誤消息。

+0

thx,我不能保證文件具有相同的行數,所以看着php.net,我需要3個嵌套循環嗎?這是來自php.net的示例代碼 <? $ fp = fopen(「myfile.txt」,「r」); $ current_line = fgets($ fp); ($ feof($ fp)){//處理當前行 $ current_line = fgets($ fp);處理當前行 } fclose($ fp); ?> – kitenski 2010-07-19 13:39:50

+0

如果它們沒有相同的行數,則在名稱和描述,類別和價格之間沒有1:1的映射關係,並將所有這些統一在一條記錄中,並將其輸入到一個記錄中數據庫表可能是一個壞主意,因爲當你更新記錄內容時它會給你帶來麻煩。 如果您的三個文件中的數據之間沒有1:1的映射關係,最好創建3個數據庫表,使用app_id作爲鏈接表的關鍵點,並使用三個while循環順序填充它們。 – JeSuisse 2010-07-19 14:50:09

0

試試這個:

 file1.txt contents: 
      id 13 category test description test 
    file2.txt: 
     id 13 name test description test 
     id 15 name test description test 
     id 17 name test description test 


    $files = array('file1.txt','file2.txt'); 

      foreach($files as $file) { 
       flush(); 
       preg_match_all("/id\s(?<id>\d+)\s(?:name|category|price)?\s(?<name>[\w]+)\sdescription\s(?<description>[^\n]+)/i",@file_get_contents($file),$match); 
        print_r($match); 
      } 

returns: 
Array 
(
    [0] => Array 
     (
      [0] => id 13 category test description test 
     ) 

    [id] => Array 
     (
      [0] => 13 
     ) 

    [1] => Array 
     (
      [0] => 13 
     ) 

    [name] => Array 
     (
      [0] => test 
     ) 

    [2] => Array 
     (
      [0] => test 
     ) 

    [description] => Array 
     (
      [0] => test 
     ) 

    [3] => Array 
     (
      [0] => test 
     ) 

) 
Array 
(
    [0] => Array 
     (
      [0] => id 13 name test description test 
      [1] => id 15 name test description test 
      [2] => id 17 name test description test 
     ) 

    [id] => Array 
     (
      [0] => 13 
      [1] => 15 
      [2] => 17 
     ) 

    [1] => Array 
     (
      [0] => 13 
      [1] => 15 
      [2] => 17 
     ) 

    [name] => Array 
     (
      [0] => test 
      [1] => test 
      [2] => test 
     ) 

    [2] => Array 
     (
      [0] => test 
      [1] => test 
      [2] => test 
     ) 

    [description] => Array 
     (
      [0] => test 
      [1] => test 
      [2] => test 
     ) 

    [3] => Array 
     (
      [0] => test 
      [1] => test 
      [2] => test 
     ) 

)