2010-05-24 26 views
1

我不確定這是否可能,我一直在搜索解決方案...但是,實際上,我有一個非常大的文件,我想將其存儲在一個數組中。因此,我正在使用file(),但有沒有辦法分批做到這一點?所以說,它所創建的每一條線都會「暫停」?增量使用file()?

我覺得有可能是我的東西可以用foreach循環或某事做,但我不知道,我想它的正確方法...

$i=0; 
$j=0; 
$throttle=100; 

foreach($files as $k => $v) { 
    if($i < $j+$throttle && $i > $j) { 
    $lines[] = file($v); 
    //Do some other stuff, like importing into a db 
    } 
    $i++; 
    $j++; 
} 

但是,我認爲這不會真的起作用,因爲$ i & $ j將永遠是平等的...無論如何,感覺混亂...有人可以幫助我認爲一個更清晰?

+0

會是有意義的文件處理線一次? – wallyk 2010-05-24 01:08:48

+0

那麼,我仍然會遇到同樣的問題,對吧?也就是說,試圖「暫停」file()足夠長的時間來完成其他處理?它仍然會嘗試將整個文件讀入一個數組,對吧? – Q7898339 2010-05-24 01:10:56

回答

0

你永遠不增加$ i或附加$ J ...你可以做的,是一樣的東西:

$data = array(); 
    $chunk = 100; 
    $f = fopen($file, 'r'); 
    while (!feof($f)) { 
     for ($i = 0; $i < $chunk; $i++) { 
      $tmp = fgets($f); 
      if ($tmp !== false) { 
       $data[] = $tmp; 
      } else { 
       //No more data, break out of the inner loop 
       break; 
      } 
     } 
     //Process your data 


     $data = array(); 
    } 
    fclose($f); 
+0

是的,我看到了它,並編輯它,但猜你發現我太快了......謝謝你! – Q7898339 2010-05-24 01:23:34

2

一行讀入行的文件,你需要然而,許多線,追加每行一個陣列。當數組達到所需長度時,處理它並清空數組。例如:

$handle = @fopen("/tmp/inputfile.txt", "r"); 
$throttle = 100; 
$data = array(); 
if ($handle) { 
    while(!feof($handle)) { 
     $buffer = fgets($handle, 4096); 
     $data[] = $buffer; 
     if(count($data) == $throttle) { 
      doSomething($data); 
      $data = array(); 
     } 
    } 
    fclose($handle); 
}