2011-06-04 53 views
3

我正在使用PHP从CSV文件中公开车辆GPS数据。这些数据至少每30秒就会被超过70辆车辆捕获并包含19列数据。这会产生几千行约614kb的数据和文件大小。新数据被追加到文件的末尾。我需要提取每辆车的最后一行数据,这应该代表最近的状态。我能够为每个单元拉出一行,但是由于CSV文件是按照时间顺序排列的,因此我将取出文件中最旧的数据而不是最新的数据。是否可以从头到尾读取CSV?我已经看到了一些解决方案,但是它们通常涉及将整个文件加载到内存中然后反转,这听起来效率很低。我有其他选择吗?感谢您提供任何建议。在PHP中从头到尾阅读CSV

编辑:我正在使用这些数据来实时映射实时位置。数据仅以CSV格式提供给我,所以我认为导入数据库是不可能的。

+0

也许在这种情况下csv不是保存的适当方式。为什么不使用数据库? – Ibu 2011-06-04 21:11:42

+0

只需要几分钟时间将数据导出到数据库,我推荐使用mysql – Ibu 2011-06-04 21:12:11

+0

@lbu:他/她可能正在使用多个系统之间的共享文件。如果是这样,我推荐使用web服务。 – Nabeel 2011-06-04 21:15:21

回答

4

使用fseek您可以将指针设置为文件末尾并将其偏移为负值以向后读取文件。

+0

这不需要我将整个文件加载到内存中吗? – garnertb 2011-06-04 21:19:02

+1

不,你用'fopen'打开资源流,设置一个指针(用'fseek')并使用各种'fget *'函数来读取你需要的数据量(这是加载到记忆)。 – cem 2011-06-04 21:21:38

+1

请考虑在你的答案中增加一些更多的细节,以涵盖问题标题 – Trix 2015-12-28 07:26:49

0

如果您必须使用csv文件而不是数据库,那么也许您可以逐行读取文件。这将防止超过最后一行被存储在内存中(感谢垃圾收集器)。

$handle = @fopen("/path/to/yourfile.csv", "r"); 
if ($handle) { 
    while (($line = fgets($handle)) !== false) { 
     // old values of $last are garbage collected after re-assignment 
     $last = $line; 
     // you can perform optional computations on past data here if desired 
    } 
    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 
    fclose($handle); 

    // $last will now contain the last line of the file. 
    // You may now do whatever with it 
} 

编辑:我没有看到fseek()的帖子。如果你需要的只是最后一行,那么这就是要走的路。