0

我有一个要过滤的 csv 文件。如果增量不等于 2,我需要的输出只是输出行。在下面的 csv 文件中,我想将第一行与第二行进行比较,如果增量为 2,请检查第 3 行与第 3 行2,以此类推。如果增量不等于 2,则输出该行。我正在查看第三个 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 行会输出到页面。我坚持这一点,并希望在哪里寻找任何帮助或方向。谢谢

4

1 回答 1

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>=5.4 对于 PHP 5.3,您应该将数组定义替换为

$result     = array();

如果你有更旧的 PHP 版本,比如 5.2,那么里面的回调array_map()应该用 using 重写create_function()

于 2013-10-09T09:50:22.887 回答