如何使用perl/php/grep/etc从csv中提取日期范围?

2024-09-28 20:51:10 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种方法可以获取像下面这样的文本(如果它已经在数组或文件中)并让它去掉具有指定日期范围的行?在

例如,如果我希望从2009-09-04到2009-09-09的每一行都被拉出(也许这可以用grep来完成?)我该怎么做呢?在

date,test,time,avail
2009-09-01,JS,0.119,99.90
2009-09-02,JS,0.154,99.89
2009-09-03,SWF,0.177,99.90
2009-09-04,SWF,0.177,99.90
2009-09-05,SWF,0.177,99.90
2009-09-06,SWF,0.177,99.90
2009-09-07,SWF,0.177,99.90
2009-09-08,SWF,0.177,99.90
2009-09-09,SWF,0.177,99.90
2009-09-10,SWF,0.177,99.90

谢谢!在


Tags: 文件方法test文本datetimejs数组
3条回答

(这个解决方案是用PHP编写的——但我想,您可以直接从命令行使用某种grep或任何东西来实现)

考虑到您的日期是YYYY-MM-DD格式,并且它们位于每行的开头,您只需按字母顺序比较行就可以比较日期。在

一种解决办法是:

  • 加载字符串
  • 按行分解
  • 删除第一行
  • 重复这些行,只保留您感兴趣的行

对于第一部分:

$str = <<<STR
date,test,time,avail
2009-09-01,JS,0.119,99.90
2009-09-02,JS,0.154,99.89
2009-09-03,SWF,0.177,99.90
2009-09-04,SWF,0.177,99.90
2009-09-05,SWF,0.177,99.90
2009-09-06,SWF,0.177,99.90
2009-09-07,SWF,0.177,99.90
2009-09-08,SWF,0.177,99.90
2009-09-09,SWF,0.177,99.90
2009-09-10,SWF,0.177,99.90
STR;
$lines = explode(PHP_EOL, $str);
unset($lines[0]); // first line is useless

并且,为了迭代这些行,过滤掉你想要的/不想要的,你可以使用foreach循环。。。或者使用^{}函数,它只为这个而存在;-)

例如,您可以使用以下内容:

^{pr2}$

你的回调函数是:

function my_filter($line) {
    $min = '2009-09-04';
    $max = '2009-09-09';
    if ($line >= $min && $line <= $max) {
        return true;
    } else {
        return false;
    }
}

结果是:

array
  4 => string '2009-09-04,SWF,0.177,99.90' (length=26)
  5 => string '2009-09-05,SWF,0.177,99.90' (length=26)
  6 => string '2009-09-06,SWF,0.177,99.90' (length=26)
  7 => string '2009-09-07,SWF,0.177,99.90' (length=26)
  8 => string '2009-09-08,SWF,0.177,99.90' (length=26)

希望这有帮助;—)


如果日期不是YYYY-MM-DD格式,或者不是在每一行的开头,则必须^{}行,并使用^{}(或者根据格式进行一些自定义分析),然后比较时间戳。在

但是,对你来说。。。不需要这些;—)

Python

import csv
import datetime

start= datetime.datetime(2009,9,4)
end= datetime.datetime(2009,9,9)

source= csv.DictReader( open("someFile","rb") )
for row in source:
    dt = datetime.datetime.strptime(row['date'],"%Y-%m-%d")
    if start <= dt <= end:
        print row # depends on what "pulled out" means

好吧,你也许可以用grep让它工作,但是sed更适合这个任务:

sort < file.csv | sed -ne /^2009-09-04/,/^2009-09-09/p

相关问题 更多 >