PHP读取CSV并按日期过滤

时间:2010-01-24 16:28:29

标签: php

我有以下CSV

Date,Event,Description
24/01/2010,Football,Football practice for all Years.
24/01/2010,Cricket,Cricket Practice for all Years.
25/01/2010,Piano Lessons,Paino lessons for Year 10.

Date, Event and Description是我想要过滤的标题。

我今天收到日期,然后我想阅读CSV并输出与今天相匹配的事件。我也希望得到明天的活动。

6 个答案:

答案 0 :(得分:3)

如上所述,您确实想使用fgetcsv()。以下是你可以这样做的方法(未经测试):

<?php
if (($handle = fopen("test.csv", "r")) !== FALSE) {
   $today = strtotime("today");
   $tomorrow = strtotime("tomorrow");
   while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        if (strtotime($data[0]) == $today || strtotime($data[0]) == $tomorrow)) {
            echo 'Category: ' . $data[1] . "<br>\n";
            echo 'Event: ' . $data[0] . "<br><br>\n\n";
        }        
    }
    fclose($handle);
}
?>

答案 1 :(得分:1)

执行此操作的最快(但不是最佳)方法是使用fgetcsv,然后遍历表格,挑选出今天的日期。

我可能会重新考虑数据的格式(使其成为数据库),除非有其他应用程序依赖它。

答案 2 :(得分:0)

有很多方法可以读取CSV文件;您也可以逐行阅读并使用split函数将每个字段分隔为数组中的元素。

如果不考虑搜索速度和复杂性,您可以进行线性迭代并检查日期。您可能希望使用strtotime将日期转换为unix时间戳以进行比较。

如果搜索速度很重要,那么将日期转换为时间戳,有一个关联数组,哪个键是时间戳(本质上是一个哈希表)

要获得明天的约会,请查看date function documentation in the PHP manual

答案 3 :(得分:0)

单程

$today=date('d/m/Y');
$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
$tmr = date("d/m/Y", $tomorrow)."\n";
$handle = fopen("file", "r");
fgets($handle,2048);
while (($data = fgetcsv($handle, 2048, ",")) !== FALSE) {
    $date=explode("/",$data[0]);
    if ( $today == $data[0] || $tmr == $data[0]){
        $j = implode(",", $data);
        print $j."\n";
    }
}
fclose($handle);

答案 4 :(得分:0)

作为替代fgetcsv并进行迭代,您还可以使用正则表达式来获取相应的行,例如对

Date,Event,Description
24/01/2010,Football,Football practice for all Years.
24/01/2010,Cricket,Cricket Practice for all Years.
25/01/2010,Piano Lessons,Paino lessons for Year 10.
26/01/2010,Piano Lessons II.

使用

date_default_timezone_set('Europe/Berlin');    
$pattern = sprintf('#%s.*|%s.*#', date('d/m/Y'), 
                                  date('d/m/Y', strtotime("+1 day")) );
$file = file_get_contents('filename.csv');
preg_match_all($pattern, $file, $matches);
var_dump($matches);

并收到

array(1) {
  [0]=>
  array(3) {
    [0]=> string(53) "24/01/2010,Football,Football practice for all Years."
    [1]=> string(51) "24/01/2010,Cricket,Cricket Practice for all Years."
    [2]=> string(52) "25/01/2010,Piano Lessons,Paino lessons for Year 10."
  }
}

虽然没有对此进行基准测试。由于file_get_contents将整个文件加载到变量中,因此根据CSV文件的大小,这可能会占用大量内存。


SplFileObject的另一个替代

$today    = date('d/m/Y');
$tomorrow = date('d/m/Y', strtotime("+1 day"));
$file = new SplFileObject("csvfile.csv");
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
    list($date, $event, $description) = $row;
    if($date === $today || $date === $tomorrow) {
        echo "Come visit us at $date for $description";
    }
}

答案 5 :(得分:0)

您可以花很多时间尝试遍历csv文件中的每一行,或者可以尝试类似的东西:

$command = sprintf("grep '%s' -Er %s", date('d/m/Y'), $this->db);
$result = `$command`;

这个例子确实有效,而且非常快!