我有一个我想过滤的csv文件。如果增量不等于2,我需要的输出只是输出行。在下面的csv文件中,我想比较第一行和第二行,如果增量是2,检查第3行与行2,依此类推。如果增量不等于2,则输出该行。我正在看第3个cloumn值
L1,is,2.0,mins,LATE,for,Arrive,at,shop,18:07:46
L1,is,4.0,mins,LATE,for,Arrive,at,shop,18:09:46
L1,is,6.0,mins,LATE,for,Arrive,at,shop,18:11:46
L1,is,8.0,mins,LATE,for,Arrive,at,shop,18:13:46
L1,is,10.0,mins,LATE,for,Arrive,at,shop,18:15:46
L1,is,2.0,mins,LATE,for,Arrive,at,shop,18:19:49
L1,is,4.0,mins,LATE,for,Arrive,at,shop,18:21:49
L1,is,6.0,mins,LATE,for,Arrive,at,shop,18:23:49
L1,is,8.0,mins,LATE,for,Arrive,at,shop,18:25:49
L1,is,10.0,mins,LATE,for,Arrive,at,shop,18:27:49
L1,is,16.2,mins,LATE,for,Arrive,at,shop,18:34:02
L1,is,18.2,mins,LATE,for,Arrive,at,shop,18:36:02
L1,is,20.2,mins,LATE,for,Arrive,at,shop,18:38:02
L1,is,2.0,mins,LATE,for,Arrive,at,bridge,21:45:26
L1,is,4.0,mins,LATE,for,Arrive,at,bridge,21:47:26
L1,is,6.0,mins,LATE,for,Arrive,at,bridge,21:49:26
因此只有第5,10,13和16行会输出到页面。 我坚持这一点,并希望得到任何帮助或指导方向。 感谢
答案 0 :(得分:0)
如果您的文件不是太大,可以直接将其加载到内存中,如下所示:
$data = array_map(function($row)
{
return explode(',', $row);
}, file('/path/to/file.csv', FILE_IGNORE_NEW_LINES));
$result = [];
$increment = 2;
$delta = 1E-13;
for($i=1; $i<count($data); $i++)
{
if(abs($data[$i][2]-$data[$i-1][2]-$increment)>$delta)
{
$result[$i] = $data[$i];
}
}
- 因为你的列包含浮点数,所以对等式的安全比较将使用精确增量。
您的数据将收集在$result
数组中,因此您可以将其输出为
foreach($result as $row)
{
echo(join(',', $row).PHP_EOL);
}
- 或者,否则,不要在$result
数组中存储行(如果不再需要它们),并使用第一个循环输出行。
修改的: 上面的示例将在PHP中工作&gt; = 5.4对于PHP 5.3,您应该将数组定义替换为
$result = array();
如果你有更旧的PHP版本,比如5.2,那么array_map()
内的回调应该使用create_function()
重写