2017-04-25 172 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以使其基于零。