2017-04-25 106 views
0

我有一個函數從參數中獲取.csv文件,並獲取此數組的一個myrownumber(指示.csv的一行的數字)。在PHP中讀取csv文件上的特定行

這將返回csv文件的行號myrownumber的內容。

private function readASpecificRow($filePath, $myrownumber) 
{ 
    $rowImLookingFor = array(); 
    $f = fopen($filePath, "r"); 
    $i = 0; 
    while (($line = fgetcsv($f)) !== false) 
    { 
     $i ++; 
     foreach ($line as $cell) 
     { 
      if ($i == $myrownumber) 
      { 
       array_push($rowImLookingFor, $cell); 
      } 
     } 
    } 
    fclose($f); 

    return($rowImLookingFor); 
} 

這正如我遍歷所有的文件,直到我發現我在尋找該行非常innefficent。

是否有任何其他方式直接讀取csv文件的行號myrownumber

PS:我知道有很多解決方案與將喜歡用fgetcsv因爲細胞是一些換行,並與fgetscsv我把它的控制,以保持。如果我使用file或其他什麼,由於某些單元格內部的換行符,行數與csv的實際行數不同。

在此先感謝。

+1

你可以在'foreach'之外加上'$ i == $ myrownumber'。沒有必要爲每個單元檢查它,當它只在每一行上發生變化時。 – Ezenhis

回答

0

您可以使用file()按行獲取文件,而不是使用str_getcsv將特定行解析爲CSV。

+0

請閱讀帖子,我想繼續使用'fgetscsv'。如果我使用'file()',行數與原始'csv'文件不同,因爲它們在單元格上有換行符。 –

+0

@Avión稍後您是否需要這些新行? – Justinas

+0

你的意思是什麼? –

0

我知道這並不能爲您提供不同的解決方案,但它可以幫助假定的低效率。

我個人重構功能,看上去就像這樣:

private function readASpecificRow($filePath, $myrownumber) 
{ 
    $f = fopen($filePath, "r"); 
    $i = 0; 
    $myrownumber = (int) $myrownumber; // ensure it's actually a number. 
    while (($line = fgetcsv($f)) !== false) 
    { 
     if (++$i < $myrownumber) continue; 
     fclose($f); 
     return $line; 
    } 
    return false; // if the specified line wasn't there return false 
} 

它應該是快一點。

0

有沒有簡單的方法來啓動直接讀取行,但你可以試試這個方法:

$pre_pos = <previous position>; 
fseek($file, $pre_pos); 
while(...) { 
    fgetcsv(...); 
    ... 
} 
$pre_pos = ftell($file); 
0

你需要遍歷整個文件,但一旦你行找到讓你可以提前返回它更高效一點。我看不到任何必要的內部foreach循環各行,以便可以將其刪除:

private function readASpecificRow($filePath, $myrownumber) 
{ 
    $f = fopen($filePath, "r"); 

    for($i = 1; $line = fgetcsv($f); $i++) { 
     if($i === $myrownumber) { 
      fclose($f); 
      return $line; 
     } 
    } 

    return false; 
} 

請注意,這不是從零開始的,所以如果$myrownumber爲1,它會返回第一行。將for循環中的$i = 1;更改爲$i = 0以使其基於零。