2011-11-10 38 views
0

我想讀它有一個大的HTML表格,看起來像這樣一個12MB +文件:是否有可能加快phpQuery?

<table> 
    <tr> 
     <td>a</td> 
     <td>b</td> 
     <td>c</td> 
     <td>d</td> 
     <td>e</td> 
    </tr> 
    <tr> 
     <td>a</td> 
     <td>b</td> 
     <td>c</td> 
     <td>d</td> 
     <td>e</td> 
    </tr> 
    <tr>..... up to 20,000+ rows....</tr> 
</table> 

現在,這是我如何刮它:

<? 

require_once 'phpQuery-onefile.php'; 

$d = phpQuery::newDocumentFile('http://localhost/test.html'); 

$last_index = 20000; 

for ($i = 1; $i <= $last_index; $i++) 
{ 
    $set['c1'] = $d['tr:eq('.$i.') td:eq(0)']->text(); 
    $set['c2'] = $d['tr:eq('.$i.') td:eq(1)']->text(); 
    $set['c3'] = $d['tr:eq('.$i.') td:eq(2)']->text(); 
    $set['c4'] = $d['tr:eq('.$i.') td:eq(3)']->text(); 
    $set['c5'] = $d['tr:eq('.$i.') td:eq(4)']->text(); 
} 

// code to insert to db here... 

?> 

我的基準說,這需要大約5.25小時颳去並插入1,000行到db。根據這些數據,只需要5天就可以完成整個20,000多行。

我的本地機器上運行:

  • XAMPP
  • Win 7的
  • PROC,酷睿i3 2100爲3.1GHz
  • RAM,芝奇RipJaws X 4GB雙
  • HDD,老SATA

有沒有什麼辦法可以加快這個過程?也許我是在用錯誤的方式刮擦它?請注意,該文件是在本地訪問因此我用http://localhost/test.html

稍快的解決方案:

for ($i = 1; $i <= $last_index; $i++) 
{ 
    $r = $d['tr:eq('.$i.')']; 

    $set['c1'] = $r['td:eq(0)']->text(); 
    $set['c2'] = $r['td:eq(1)']->text(); 
    $set['c3'] = $r['td:eq(2)']->text(); 
    $set['c4'] = $r['td:eq(3)']->text(); 
    $set['c5'] = $r['td:eq(4)']->text(); 
} 

// code to insert to db here... 

?> 
+0

您應該使用現成的表格提取庫,而不是自己收集數據。 (例如http://blog.mspace.fm/2009/10/14/parse-an-html-table-with-php/ - 儘管你必須小心,如果這個正則表達式對你的情況來說足夠強大。) – mario

+0

@mario是不是phpQuery已經是一個現成的庫? – IMB

回答

2

我從來沒有與phpQuery工作,但看起來像一個非常次優的方法來解析一個巨大的文件:有可能phpQuery在每次使用tr:eq('.$i.')加載一行時必須遍歷整個事物。

的更簡單(大概也更快)的方式是簡單地通過文檔的每個tr元素行走,並處理每一個元素在foreach循環的孩子。你甚至不需要phpQuery。

請參閱How to Parse XML File in PHP瞭解各種解決方案。

+0

嗯,但我不解析XML,只是HTML將工作? – IMB

+0

@IMB如果HTML是乾淨的,沒關係。然而,你可以先試着堅持使用phpQuery,你只需要改變你的方法:讓phpQuery一次性加載所有'tr's(即所有'table's的孩子名爲'tr' ...),然後走通過他們。這可能已經快幾個數量級了。 –

+0

HTML不是很乾淨。我有點明白你在說什麼,但我不知道如何在代碼中做到這一點,而不是我在上面做的。我如何加載所有TR,而不需要在每個TR中都行走?我將不得不做一個雙foreach,讓每個TDs是正確的?聽起來似乎對我來說更慢。 – IMB