繁体   English   中英

如何修改 perl 脚本以读取 excel 而不是 Html 文件

[英]How to modify a perl script to read excel instead of Html files

我的第一个问题是:

这是否可能做到这一点,因为现在我有一个 perl 脚本,它读取 Html 文件并提取数据以显示在另一个 html 文件上。

如果上述问题的答案是肯定的,那么我的第二个问题将是:

这该怎么做?

很抱歉坦率地问这个问题,但由于我对 perl 很陌生,我必须接受这项任务,所以我在这里寻求一些有用的建议或建议来指导我完成这项任务。 提前感谢您的帮助。

这是代码的一部分,因为整个块很长:

$date=localtime();
($TWDAY, $TMTH, $TD1D, $TSE, $TYY) = split(/\s+/, $date);
$TSE =~ s/\://g;
$STAMP=_."$TD1D$TMTH$TYY";

@ServerInfo=();

#---------------------------------------------------------------------------   -------------------------------
# Read Directory
#----------------------------------------------------------------------------------------------------------   
$myDir=getcwd;

#---------------------------------------------------------------------------------------------------------- 
# INITIALIZE HTML FORMAT
#----------------------------------------------------------------------------------------------------------  
&HTML_FORMAT;
#---------------------------------------------------------------------------------------------------------- 
# REPORT 
#----------------------------------------------------------------------------------------------------------  
if (! -d "$myDir/report") { mkdir("$myDir/report");};

$REPORTFILE="$myDir/report/checkpack".".htm";

open OUT,">$REPORTFILE" or die "\nCannot open out file $REPORTFILE\n\n";
print OUT "$Tag_Header";
#----------------------------------------------------------------------------------------------------------  

sub numSort {
if ($b < $a) { return -1; }
elsif ($a == $b) { return 0;}
elsif ($b > $a) { return 1; }
}

@ArrayDir = sort numSort @DirArray;

#while (<@ArrayDir>) {

@OutputDir=grep { -f and -T } glob "$myDir/*.htm $myDir/*.html";
#}

#----------------------------------------------------------------------------------------------------------

@ReadLine3=();

$xyxycnt=0;


foreach $InputFile (@OutputDir) { #---- MAIN

$filename=(split /\//, $InputFile) [-1]; print "-"x80 ; print     "\nFilename\t:$filename\n";

open IN, "<$InputFile" or die "Cannot open Input file $InputFile\n";
@MyData=();
$DataCnt=0;
@MyLine=();
$MyLineCnt=0;

while (<IN>) {
$LINE=$_;
chomp($LINE);

$LINE=~s/\<br\>/XYXY/ig;
$LINE=~s/\<\/td\>/ \nXYZXYZ\n/ig;

$LINE=~s/\<dirname\>/xxxdirnameyyy/ig;

$LINE=linetrim3($LINE);
$LINE=linetrim($LINE);

$LINE=~s/XYXY/\<br\>/ig;

$LINE=~s/xxxdirnameyyy/&lt dirname &gt/ig;

$LINE=~s/^\s+//ig;
print OUT2 "$LINE\n";

if (defined($LINE)) { $MyData[$DataCnt]="$LINE"; $DataCnt++ ; }

}

close IN;

foreach $ReadFile (@MyData) {  #--- Mydata
$MyLineCnt++;
$MyLine[$MyLineCnt]="";

#### FILENAME
$ServerInfo[0]="$filename";

#### IP ADDRESS
if ($ReadFile =~ /Host\/Device Name\:/)     { 
    #print "$ReadFile\n"
    ($Hostname)=(split /\:|\s+/, $ReadFile)[3]; print "$Hostname\n";
    &myServerInfo("$Hostname","1");

}
if ($ReadFile =~ /IP Address\(es\)/)        {@ListIP=(); $SwIP=1; $CntIP=0 ; };


#### OPERATING SYSTEM & VERSION
if ($ReadFile =~ /Operating System\:/)      { 
    $SwIP=0;
    $OS=    (split /\:|\s+/, $ReadFile)[3]; &myServerInfo("$OS","3") ; print "$OS\n";
    $OSVer= (split /\:|\s+/, $ReadFile)[-2]; &myServerInfo("$OSVer","4") ; print "$OSVer\n";

};

#### GET IP VALUE
if ($SwIP==1) {
    $ReadFile=(split /\:/,$ReadFile) [2];
    $ReadFile=~s/[a-z|A-Z]|\(|\)|\// /ig; print "$ReadFile\n";
    if ($CntIP==0) {
        #$ListIP[$CntIP]=(split /\s+/,$ReadFile) [1];
        @ListIP="$ReadFile";

    } elsif ($CntIP==1) { print "\n\t\t  $ReadFile\n" ; $ListIP[$CntIP]="\n$ReadFile"; 
    } else  { print "\t\t  $ReadFile\n" ; $ListIP[$CntIP]="\n$ReadFile"; };
     $CntIP++;
}

恐怕如果您不了解该程序中发生的事情,并且根本不了解如何处理这样的任务,Stack Overflow 可能不是寻求帮助的正确地方。


让我尝试向您展示我将采用的方法。 我假设有更多的代码。

  • 首先,写下你所知道的一切:
    • 现有文件的输入格式是什么
    • 现有文件从何而来
    • 现有文件的输出格式是什么
    • 生成的输出文件之后去哪里了
    • 新文件是什么样的
    • 新文件从哪里来
  • 使用perltidy缩进继承的代码,以便您可以更好地阅读它。 默认选项应该足够了。
  • 阅读代码,记下哪些部分做什么,添加评论
  • 为所需的输出格式编写单元测试 您可以使用Test::More 这里另一个有用的测试模块是Test::File
  • 重构生成输出格式的部分以使用特定的数据结构。 使用您的测试来确保您不会破坏它。
  • 从上面的点编写代码将新文件解析为数据结构。 现在您可以插入它并获得预期的输出。
  • 将从现有文件位置获取旧输入文件的部分重构为一个函数,以便您稍后可以将其切换为新的。
  • 编写代码以从新文件位置获取新文件。
  • 记录你做了什么,这样下一个人就不会处于同样的情况。 记住那可能是你半年后。

还要在重构时添加use strictuse warnings以更轻松地捕获错误。 如果事情因此而中断,请在继续之前使其工作。 这些 pragma 会告诉您出了什么问题。 您将遇到的最常见的一种是全局符号“$foo”需要明确的包名称 这意味着您需要将my放在第一个赋值的前面,或者在此之前声明变量。

如果您有具体问题,请用一个简短的示例将它们作为新问题提出。 阅读如何提出要求以确保您能得到这些方面的帮助。

祝你好运!


看到您的评论后,我认为您想要不同的输入和不同的输出。 在这种情况下,忽略这一点,扔掉旧代码并从头开始。 如果您对 Perl 的了解还不够多,那么如果您已经了解编程,那么请阅读 Curtis Poe 的Beginning Perl 之类的书。 如果没有,请查看 Randal L. Schwartz 的Learning Perl

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM