首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从格式化文本文件创建Html表格

如何从格式化文本文件创建Html表格
EN

Stack Overflow用户
提问于 2013-04-30 23:06:07
回答 2查看 4.9K关注 0票数 0

作为主题,我必须编写一个perl脚本来转换日志文件,如下所示:

代码语言:javascript
复制
pippo   2   64  0   2
pippo_a 3   24  0   2
Pippo_b 2   60  0   23
pluto   0   18  0   4
pluto_a 8   25  0   6

paperino    0   11  1   7
paperino_a  0   27  0   10
coyote  0   29  0   7
beepbeep    0   1   0   0
tommy   3   31  0   27
paperone    4   43  1   15
paperone_a  4   52  0   13
benjamin    0   21  1   35

paperina    10  0   0   0
papera  0   0   0   0
quiquoqua   3   26  0   17
quiquoqua_a 3   25  0   3
pochaontas  0   12  0   68

minnie  11  60  3   384

在此html表格格式中:

链接:http://imageshack.us/a/img90/7238/tabellao.jpg

现在我已经编写了这个小的perl脚本,但是在从@cells数组创建写入周期时遇到了问题:

代码语言:javascript
复制
#! /usr/bin/perl
print "Content-type:text/html\r\n\r\n";
use CGI qw(:standard);
use strict;
use warnings;
use DateTime;

my $line;
my $file;


$file='loggi.txt';
open(F,$file)||die("Could not open $file");


print "<html>\n
<style type='text/css'>\n
body {\n
font-family: Verdana, Arial, Helvetica, sans-serif;\n
color: #333;\n
}\n
table {\n
font-size:11px;\n
}\n
td#vtl, td#pool {\n
font-weight: bold;\n
writing-mode: bt-rl;\n
#-webkit-transform: rotate(90deg);\n
#-moz-transform: rotate(90deg);\n
#-ms-transform: rotate(90deg);\n
#-o-transform: rotate(90deg);\n
#transform: rotate(90deg);\n
}\n
.zone tr{\n
border:2px dotted black;\n
}\n
</style>\n
<body>\n
<table border=2>\n
<!--Intestazione-->\n
<tr>\n
    <th id='vtl'>houses</th>\n
    <th id='pool'>id</th>\n
    <th id='host'>name</th>\n
    <th id='vergini'>Ver.(*)</td>\n
    <th id='riciclabili'>(yes)</th>\n
    <th id='vuote'>zero</th>\n
    <th id='full'>Full</th>\n
    <th id='spazi'>space</th>\n
</tr>\n
<!--Corpo-->\n
<!--VTLA-->";
print "<tr align='center'>\n
    <td id='case' rowspan=7>casaa</td>\n
    <td id='id' rowspan=7>10</td>\n
    <th id='a' colspan=5>pippi</th>\n
    <td id='space' rowspan=30>0</td>\n
</tr>";

while ($line=<F>)
{ 
    print "<tr>";
    my @cells= split '  ',$line;
    foreach my $cell (@cells)
    {
        if $cell == 'pippo' {
       print "<td id='name'>$cell</td>";
       print "<td id='a'>$cell</td>";
       print "<td id='b'>$cell</td>";
       print "<td id='c'>$cell</td>";
       print "<td id='d'>$cell</td>";
    }}
    print "</tr>";
}
close(F);
print "</table>\n
<br/>\n
Situazione aggiornata al".DateTime->now()->strftime("%a, %d %b %Y %H:%M:%S %z")."
</body>\n
</html>";

这是我的第一个很长的perl脚本,有人能帮助我进行推理吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-30 23:57:57

这里有几个可以快速改进的地方

在打开文件时使用3个参数open会更安全,这样就不会意外地打印到文件中

代码语言:javascript
复制
open(my $fh, '<', $file) or die("Could not open $file");

多行的print语句读起来有点困难。通常使用-doc来定义多行字符串,如下所示

代码语言:javascript
复制
print <<"EOT";
<html>\n
<style type='text/css'>\n
body {\n
font-family: Verdana, Arial, Helvetica, sans-serif;\n
color: #333;\n
}\n
table {\n
font-size:11px;\n
}\n
td#vtl, td#pool {\n
font-weight: bold;\n
writing-mode: bt-rl;\n
etc etc etc
EOT

不过,老实说,你应该考虑使用模板工具包,或者其他模板引擎。

在Perl中,您使用eq运算符来测试字符串的等价性,所以我认为

代码语言:javascript
复制
if $cell == 'pippo' {

应该是这样的

代码语言:javascript
复制
if($cell eq 'pippo') {

最后,在脚本中常见的是逐行解析文件以使用chomp,这将从您刚刚读到的行中去掉尾随的换行符,例如

代码语言:javascript
复制
while ($line=<F>)
{ 
    chomp($line); #otherwise $line ends in \n

希望这足以让你入门,祝你好运!

票数 1
EN

Stack Overflow用户

发布于 2013-05-01 14:22:04

代码语言:javascript
复制
use strict;
use warnings;

use CGI qw(:all);

my $cgi = new CGI ;

my @header_array = ('<Header1>',
                    '<Header2>',
                    '<Header3>',
                    '<Header4>',
                    );

open (my $HTML, ">","index.html") or die $!; 
print $HTML $cgi->start_html("<Title>");
print $HTML "<link rel='stylesheet' href='<Path to css>' type='text/css' media='screen' />";

print $HTML $cgi->start_table({-border=>1, -cellspacing=>2, -cellpadding=>1});

print $HTML $cgi->Tr({-align=>'center',-valign=>'middle'},[$cgi->th(\@header_array)]);

open (my $LOG, "<","log.txt") or die $!;
foreach my $line (<$LOG>){
    my @row =  split("\t",$line);
    print $HTML $cgi->Tr({-align=>'center',-valign=>'middle'},[$cgi->th(\@row)]);
}
close ($LOG);    
print $HTML $cgi->end_table();
print $HTML $cgi->end_html();
close ($HTML);    

您可以更改打印到html文件的方式,以满足您的特定需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16303132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档