在PHP中读取csv文件中的特定行

时间:2017-04-25 09:36:43

标签: php csv

我的一个函数从参数中获取.csv文件,并且myrownumber(一个数字表示.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);
}

这是非常无用的,因为我要迭代所有文件,直到找到我正在寻找的行。

还有其他方法可以直接读取myrownumber文件的行号csv吗?

PS:我知道有许多解决方案会继续使用fgetcsv,因为在单元格上有一些换行符并且fgetscsv我保持对它的控制。如果我使用file或其他什么,由于某些单元格内部的断行,行数与csv的实际行数不同。

提前致谢。

4 个答案:

答案 0 :(得分:1)

我知道这并没有为您提供不同的解决方案,但它可能有助于假设效率低下。

我个人重构这个函数看起来更像是这样:

    public static boolean isInternetAvailable() {
    try {
        InetAddress ipAddr = InetAddress.getByName("google.com"); //You can replace it with your name
        return !ipAddr.equals("");

    } catch (Exception e) {
        return false;
    }

}

应该快一点。

答案 1 :(得分:0)

您可以使用file()逐行获取文件,而不是使用str_getcsv将特定行解析为CSV。

答案 2 :(得分:0)

没有简单的方法可以直接开始阅读行,但你可以尝试这样做:

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

答案 3 :(得分: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,使其从零开始。