如果列增量为2,则仅输出csv行

时间:2013-10-09 09:27:03

标签: php csv

我有一个我想过滤的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行会输出到页面。 我坚持这一点,并希望得到任何帮助或指导方向。 感谢

1 个答案:

答案 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()重写