Tarihe göre PHP Okuma CSV ve filtre

5 Cevap

Ben şu CSV var

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 I göre filtre etmek istediğiniz başlıkları vardır.

Ben bugünün tarihini alıyorum ve sonra CSV ve çıktılarının bugünün tarihini neticesinde olay / s okumak istiyorum. Ben aynı zamanda yarınlar olayları almak istiyorum.

5 Cevap

tek yön

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

Bir alternative fgetcsv ve yineleme gibi, aynı zamanda, örneğin, uygun satırları almak için normal ifadeleri kullanabilirsiniz için

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.

kullanmak

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

ve alma

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

Gerçi bu Benchmarking değil. CSV dosyasının boyutuna bağlı olarak, bu nedeniyle file_get_contents bir değişken tüm dosya yükleme için, yoğun bellek alabilir.


Başka bir alternative ile 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";
    }
}

Yukarıda belirtildiği gibi kullanmak istiyorsun fgetcsv(). Burada (denenmemiş) bunu nasıl bulunuyor:

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

Bunu yapmanın en hızlı (henüz uygun değil) yoludur bugün bu tarihleri ​​seçmek dışarı, fgetcsv kullanarak ve daha sonra masanın üzerinde yineleme edilir.

Buna bağlı olarak diğer uygulamalar olmadığı sürece ben muhtemelen, (bir veritabanı yapmak) veri biçimini yeniden istiyorum.

CSV dosyalarını okumak için oldukça fazla birçok yolu vardır; Ayrıca satır satır okumak ve her bir dizinin bir elemanı olarak yayımlandı ayırmak için bölünmüş işlevini kullanabilirsiniz.

Arama hızı ve karmaşıklığı bir endişe değil, bir doğrusal yineleme yapmak ve tarihler için kontrol edebilirsiniz. Karşılaştırma için Unix zaman damgası içine tarih dönüştürmek için strtotime kullanmak isteyebilirsiniz.

Arama hızı önemli ise, daha sonra, zaman damgası tarih dönüştürebilirsiniz anahtar zaman damgası (aslında bir karma tablo) bir ilişkisel dizi var

Yarının tarihi almak için, date function documentation in the PHP manual check out.