100万のレコードと1つの日付(14/03/2017 00:11:17)を含むサンプルCSVデータファイルがあります。このサンプルCSVファイルから6ヶ月分のデータを生成する必要があります。 Bashスクリプトは1日分のデータを生成するのに20分かかります。
データサンプル
- '2017-12-01 03:22:17,サンプルデータ,1234,サンプル,123455,67546464'
予想される結果
'01/01/2017 03:22:17,サンプルデータ,1234,サンプル,123455,67546464'
'2017-02-01 03:22:17,サンプルデータ,1234,サンプル,123455,67546464'
到着
'2017-01-30 03:22:17,サンプルデータ,1234,サンプル,123455,67546464'
答え1
cat 6months.pl
#!/usr/bin/env perl
use Text::CSV;
use DateTime;
use DateTime::Format::Strptime;
use autodie qw/ open close /;
my $csv = Text::CSV->new({binary => 1, quote_space => 0});
my $dateparser = DateTime::Format::Strptime->new(pattern => "%d/%m/%Y %T", time_zone => "local");
for my $file (@ARGV) {
open my $fh, '<', $file;
while (my $row = $csv->getline($fh)) {
my $datestr = shift @$row;
my $date = $dateparser->parse_datetime($datestr)->truncate(to => month);
my $end = $date->clone->add(months => 6);
while ($date <= $end) {
$csv->say(STDOUT, [$dateparser->format_datetime($date), @$row]);
$date = $date->add(days => 1);
}
}
close $fh;
}
実行してください:
perl 6months.pl data.csv
01/01/2017 00:00:00,sampledata,1234,sample,123455,67546464
02/01/2017 00:00:00,sampledata,1234,sample,123455,67546464
...
30/06/2017 00:00:00,sampledata,1234,sample,123455,67546464
01/07/2017 00:00:00,sampledata,1234,sample,123455,67546464
これで時間が真夜中にリセットされることがわかりました。時間を節約するには:
my $date = $dateparser->parse_datetime($datestr)->set(day => 1);
# ^^^^^^^^^^^^^