我有以下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并输出与今天相匹配的事件。我也希望得到明天的活动。
答案 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`;
这个例子确实有效,而且非常快!