PHP Читать CSV и фильтровать по дате - PullRequest
1 голос
/ 24 января 2010

У меня есть следующий 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 ]

3 голосов
/ 24 января 2010

Как уже упоминалось выше, вы хотите использовать 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 голос
/ 24 января 2010

Самый быстрый (но не оптимальный) способ сделать это - использовать fgetcsv , а затем выполнить итерацию по таблице, выбирая те даты, которые сегодня.

Я бы, вероятно, пересмотрел формат данных (сделал бы их базой данных), если только нет других приложений, зависящих от него.

0 голосов
/ 16 декабря 2016

Вы можете потратить много времени, пытаясь пройти каждую строку в CSV-файле, или можете попробовать что-то вроде этого:

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

Этот пример действительно работает и работает очень быстро!

0 голосов
/ 24 января 2010

В качестве альтернативы - 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."
  }
}

Хотя это не было сравнением. В зависимости от размера вашего CSV-файла это может занять много памяти из-за file_get_contents загрузки всего файла в переменную.

<Ч />

Другой альтернативный с 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 голосов
/ 24 января 2010

в одну сторону

$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 голосов
/ 24 января 2010

Существует довольно много способов чтения файлов CSV; Вы также можете читать построчно и использовать функцию split для разделения каждого файла как элемента в массиве.

Если скорость и сложность поиска не важны, вы можете выполнить линейную итерацию и проверить даты. Вы можете использовать strtotime для преобразования даты в метку времени Unix для сравнения.

Если важна скорость поиска, преобразовать дату в метку времени, иметь ассоциативный массив, ключом которого является метка времени (по сути, хеш-таблица)

Чтобы узнать завтрашнюю дату, ознакомьтесь с документацией к функции date в руководстве по PHP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...