2021年4月22日木曜日

WHOのCOVID-19データ(4)

 WHOのCOVID-19データ(3)からの続き

WHOのCOVID-19統計のjsonデータの構造が変わったようで,scriptの出力に不具合が生じている。プログラミングが面倒である。これまでは,国・地域別のブロックの中に一連の時系列データが含まれていたところ,このたびは,時系列ブロックの中に一連の国・地域別データが並んでいる。前回よりもプログラムの構造が汚くなってしまった。日時データが通常の形式になっていたので,unix time を経由しなくても良いかと思ったが,そうは問屋が下さなかった。(注 \$ は $と読み替え)


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#!/usr/bin/perl
# 4/24/2021 K. Koshigiri
# usage: json.pl 2021/04/24 3
# extract 3 day data from 2021/04/24
# original data = https://covid19.who.int/page-data/table/page-data.json

use Time::Local 'timelocal';

$tmp = "tmpx";
$in = "whox";
$out = "who-dat.csv";
$jsn = "https://covid19.who.int/page-data/table/page-data.json";
($sec, \$min, \$hour) = (0,0,0);
($year, \$month, \$day) = split '/', \$ARGV[0];
$epochtime = timelocal(\$sec, \$min, \$hour, \$day, \$month-1, \$year-1900)+32400;

system("lynx -source \$jsn | fsp -u > \$tmp");

open(OUT, ">\$in");
open(IN, "<\$tmp");
while(
) {
  s/],/],\n/g;
  print OUT;
}
close(IN);
close(OUT);

open(OUT,">\$out");
print OUT "Date, Country Code, Region Code, Deaths, Cumulative Deaths, Deaths Last 7 Days, Deaths Last 7 Days Change, Deaths Per 100k, Confirmed, Cumulative Confirmed, Cases Last 7 Days,Cases Last 7 Days Change, Cases Per 100k, WkCasePop, WkDeathPop\n";

for ($i=0; \$i<\$ARGV[1]; \$i++) {
  $ut=\$epochtime+86400*\$i;
  (sec, $min, \$hour, \$day, \$month, \$year) = gmtime(\$ut);
  year += 1900;
  month += 1;
  if($month < 10) {
    $ym = "\$year-0\$month";
  } else {
    $ym = "\$year-\$month";
  }
  if($day < 10) {
    $dt = "\$ym-0\$day";
  } else {
    $dt = "\$ym-\$day";
  }
  print "$dt\n";
  $sw=0;
  open(IN, "<$in");
    while(
) {
      s/\]//g;
      s/\[//g;
      s/"rows"://g;
      if(/"totals":/) {
        if(/$dt/) {
          $sw=1;
        } else {
          $sw=0;
        }
      }
      if($sw==1 && /"[A-Z][A-Z]","[A-Z]{4,5}"/ ) {
        print OUT "$dt,";
        print OUT;
      } elsif($sw==1 && /" ","[A-Z]{4,5}"/) {
        print OUT "$dt,";
        print OUT;
      }
    }
  close(IN);
}
close(OUT);


0 件のコメント: