PHP Read CSV and filter by date

前端 未结 6 1949
再見小時候
再見小時候 2021-01-24 08:12

I have the following CSV

Date,Event,Description
24/01/2010,Football,Football practice for all Years.
24/01/2010,Cricket,Cricket Practice for all Years.
25/01/201         


        
相关标签:
6条回答
  • 2021-01-24 08:14

    As an alternative to fgetcsv and iterating, you could also use a Regular Expressions to get the appropriate lines, e.g. for

    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.
    

    use

    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);
    

    and receive

    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."
      }
    }
    

    Haven't benchmarked this though. Depending on the size of your CSV file, this could get memory intensive, due to file_get_contents loading the entire file into a variable.


    Another alternative with 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";
        }
    }
    
    0 讨论(0)
  • 2021-01-24 08:27

    There are pretty much many ways to read a CSV files; you can also read in line by line and use the split function to separate each filed as an element in an array.

    If search speed and complexity is not a concern, you can do a linear iteration and check for dates. You may want to use strtotime to convert the date into a unix timestamp for comparison.

    If the search speed is important, then convert the date to timestamp, have an associative array which key is the timestamp (essentially a hash table)

    To get tomorrow's date, check out the date function documentation in the PHP manual.

    0 讨论(0)
  • 2021-01-24 08:27

    one way

    $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);
    
    0 讨论(0)
  • 2021-01-24 08:28

    You can spend lot of time trying to traverse each line in csv file, or can try something like that:

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

    This example really works and it is really fast!

    0 讨论(0)
  • 2021-01-24 08:29

    As mentioned above you do want to use fgetcsv(). Here's how you might do it (untested):

    <?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);
    }
    ?>
    
    0 讨论(0)
  • 2021-01-24 08:29

    The fastest (yet not optimal) way to do this is using fgetcsv and then iterate over the table, picking out those dates that are today.

    I'd probably reconsider the format of the data (make it a database), unless there are other apps depending on it.

    0 讨论(0)
提交回复
热议问题