免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5086 | 回复: 11
打印 上一主题 下一主题

Perl脚本下载文件重命名问题``` [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-09-09 17:03 |只看该作者 |倒序浏览
因为工作需要,使用一个perl脚本,下载noaa的气象数据,但应用中需要将文件更名为时间、层序和元素命名的文件,由于以前没有接触过perl,求助各位大大!
具体代码如下:
if ($action ne 'data' && $action ne 'inv') {
   print "action must be inv or data, not $action\n";
   exit(;
}

if ($YYYY < 2006 || $YYYY > 2030) {
   print "bad date (year) code $time\n";
   exit(;
}
if ($MM < 1 || $MM > 12) {
   print "bad date (month) code $time\n";
   exit(;
}
if ($DD < 1 || $DD > 31) {
   print "bad date (day) code $time\n";
   exit(;
}
if ($HH < 0 || $HH > 23) {
   print "bad date (hour) code $time\n";
   exit(;
}
if ($hr0 == $hr1) {
   $dhr = 3;
}

if ($dhr != 3 && $dhr != 6 && $dhr != 12 && $dhr != 24) {
   print "dhr must be 3, 6, 12 or 24, not $dhr\n";
   exit(;
}

if ($hr0 > $hr1) {
   print "hr0 needs to be <= hr1\n";
   exit(;
}
if ($dhr <= 0) {
   print "dhr needs to be > 0\n";
   exit(;
}
if (! -d $OUTDIR && $action ne 'inv') {
   print "Directory $OUTDIR does not exist\n";
   exit(;
}

$VARS =~ tr/:_/| /;
if( $VARS =~ m/ALL/ig ) { $VARS = "."; }
else { $VARS = "$VARS):"; }

$LEVS =~ tr/:_/| /;
if( $LEVS =~ m/ALL/ig ) { $LEVS = "."; }
else { $LEVS = "$LEVS)" ; }

$URL =~ s/\$YYYY/$YYYY/g;
$URL =~ s/\${YYYY}/$YYYY/g;
$URL =~ s/\$MM/$MM/g;
$URL =~ s/\${MM}/$MM/g;
$URL =~ s/\$DD/$DD/g;
$URL =~ s/\${DD}/$DD/g;
$URL =~ s/\$HH/$HH/g;
$URL =~ s/\${HH}/$HH/g;

$output = '';

$fhr=$hr0;
while ($fhr <= $hr1) {
   if ($fhr <= 9) { $fhr="0$fhr"; }
   $fhr3=$fhr;
   if ($fhr <= 99) { $fhr3="0$fhr"; }
   $url = $URL;
   $url =~ s/\$FHR3/$fhr3/g;
   $url =~ s/\${FHR3}/$fhr3/g;
   $url =~ s/\$FHR/$fhr/g;
   $url =~ s/\${FHR}/$fhr/g;
   $file = $url;
   $file =~ s/^.*\///;

   #
   # read the inventory
   #    $line[] = wgrib inventory,  $start[] = start of record (column two of $line[])
   #

   if ($windows eq 'yes') {
      $err = system("$curl -f -s $url$inv -o $OUTDIR/$file.tmp";
      $err = $err >> 8;
      if ($err) {
         print STDERR "error code=$err,  problem reading $url$inv\n";
         sleep(10);
         exit(;
      }
      open (In, "$OUTDIR/$file.tmp";
   }
   else {
      open (In, "$curl -f -s $url$inv |";
   }

   $n=0;
   while (<In> {
      chomp;
      $line[$n] = $_;
      s/^[^:]*://;
      s/:.*//;
      $start[$n] = $_;
      $n++;
   }
   close(In);
   if ($n == 0) {
       print STDERR "roblem reading file $url$inv\n";
       sleep(10);
       exit(8);
   }

   #
   # find end of record: $last[]
   #

   $lastnum = $start[$n-1];
   for ($i = 0; $i < $n; $i++) {
      $num = $start[$i];
      if ($num < $lastnum) {
         $j = $i + 1;
         while ($start[$j] == $num) { $j++; }
         $last[$i] = $start[$j] - 1;
      }
      else {      
         $last[$i] = '';
      }
   }
   
   if ($action eq 'inv') {
      for ($i = 0; $i < $n; $i++) {
         print "$line[$i]:range=$start[$i]-$last[$i]\n";
      }
      exit(0);
   }

   #
   # make the range field for Curl
   #

   $range = '';
   $lastfrom = '';
   $lastto = '-100';
   for ($i = 0; $i < $n; $i++) {
      $_ = $line[$i];
      if (/$LEVS/i && /$VARS/i) {
         $from=$start[$i];
         $to=$last[$i];

         if ($lastto + 1 == $from) {
            $lastto = $to;
         }
         elsif ($lastto ne $to) {
            if ($lastfrom ne '') {
               if ($range eq '') { $range = "$lastfrom-$lastto"; }
               else { $range = "$range,$lastfrom-$lastto"; }
            }
            $lastfrom = $from;
            $lastto = $to;
        }
      }
   }
   if ($lastfrom ne '') {
      if ($range eq '') { $range="$lastfrom-$lastto"; }
      else { $range="$range,$lastfrom-$lastto"; }
   }

   if ($range ne '') {
      $err = system("$curl -f -v -s -r \"$range\" $url$grb -o $OUTDIR/$file.tmp";
      $err = $err >> 8;
      if ($err != 0) {
         print STDERR "error in getting file $err $url$grb\n";
         sleep(20);
         exit $err;
      }
      rename "$OUTDIR/$file.tmp", "$OUTDIR/$file";
      $output = "$output $OUTDIR/$file $VARS";
   }
   else {
      print "no matches (no download) for $file\n";
   }
   $fhr += $dhr;
}
print "\n\nfinished download\n\n$output $VARS\n";
exit(0);

论坛徽章:
0
2 [报告]
发表于 2015-09-09 17:04 |只看该作者
lol:lo求大大帮助!

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
3 [报告]
发表于 2015-09-09 18:21 |只看该作者
代码太长了,有什么困难的直接提出来

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2015-09-09 20:20 |只看该作者
这必须有偿求助,免费的求助估计没有人愿意耗费精力去研究这么长的代码。

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
5 [报告]
发表于 2015-09-10 09:14 |只看该作者
而且看完你的问题,还是没懂你到底要什么

论坛徽章:
10
2015亚冠之广州富力
日期:2015-06-16 14:44:332015亚冠之西悉尼流浪者
日期:2015-08-19 13:14:352015亚冠之阿尔希拉尔
日期:2015-08-04 09:38:052015亚冠之萨济拖拉机
日期:2015-07-31 15:01:582015亚冠之首尔
日期:2015-07-27 14:24:312015亚冠之塔什干火车头
日期:2015-07-20 09:47:202015亚冠之布里斯班狮吼
日期:2015-07-15 14:58:432015亚冠之首尔
日期:2015-07-07 09:31:262015亚冠之广州恒大
日期:2015-07-06 15:41:272015亚冠之首尔
日期:2015-08-27 11:03:01
6 [报告]
发表于 2015-09-10 09:14 |只看该作者
而且看完你的问题,还是没懂你到底要什么

论坛徽章:
0
7 [报告]
发表于 2015-09-10 09:19 |只看该作者
回复 3# yybmsrs


    就是想把抓取获得的无格式文件重命名。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2015-09-10 09:22 |只看该作者
回复 7# tusigi


    你把那个 rename 的参数改改不就结了?

论坛徽章:
0
9 [报告]
发表于 2015-09-10 09:32 |只看该作者
改了以后输入的文件名没有变,而且成为了有格式的.tmp文件,我是在windows上跑的脚本,难道rename不能用?

回复 8# MMMIX


   

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
10 [报告]
发表于 2015-09-10 09:58 |只看该作者
回复 9# tusigi


    你这句话中的每个字我都认识,可是合起来之后根本不明白你在说啥!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP