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

时间:2015-06-11 09:14:28

标签: excel perl

我的第一个问题是:

  

这是否可以这样做,因为现在我有一个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++;
}

1 个答案:

答案 0 :(得分:0)

我担心如果你不理解这个程序中发生了什么,你也根本不理解如何处理这样的任务,Stack Overflow可能不是获得帮助的正确位置。< / p>

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

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

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

如果您有特定的问题,请将其作为一个新问题,并举一个简短示例。阅读how to ask以确保您能获得有关这些内容的帮助。

祝你好运!

在看到your comment之后我想你想要一个不同的输入和一个不同的输出。在这种情况下,忽略这一点,抛弃旧代码并从头开始。如果您对Perl知之甚少,那么如果您已经了解编程,请获取像Curtis Poe的 Beginning Perl 这样的书。如果没有,请查看Randal L. Schwartz的 Learning Perl