我的一个函数从参数中获取.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
吗?
fgetcsv
,因为在单元格上有一些换行符并且fgetscsv
我保持对它的控制。如果我使用file
或其他什么,由于某些单元格内部的断行,行数与csv的实际行数不同。
提前致谢。
答案 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
,使其从零开始。