in reply to Re: split the text file to multiple arrays
in thread split the text file to multiple arrays

please help me to check why my code does not display the table in this format. Really appreciated ur zen time :)

Persons Absences

table data

Replacement Persons

table data

Room Changes

table data

#!/usr/bin/perl use strict; use warnings; use File::Copy; use File::stat; use Time::localtime; #testing my $dest = "C:/Perl-Script/"; my ($date,$time) = &GetTodaysDate; my $space = '1'; open OUT, ">C:/Perl-Script/Bulletin.html"; print OUT "<HTML><head><title>My Learning Page</title></head>"; print OUT "<h2><font color=#ffffff</font>My Home Page</h2>"; print OUT "<h2>Bulletin Date $date $time</h2></style>"; print OUT "<body bgcolor=#002b46>"; my %hdata = &build_hash(); foreach my $key (sort keys %hdata) { my @arrays = @{$hdata{$key}}; if (($key eq '"$Persons Absences?"')|| ($key eq '"$Replacement + Persons?"') || ($key eq '"$Room Changes?"')){ print OUT "\n\n"; print OUT "<h3>$key</h3>\n"; print OUT "<table border = 1 width = 1000 bordercolor=#e0e +0e0 cellpadding = 5 align=left>"; #print " $key = $data{$key}[$i]\n"; #$i= 0 is the title of + table for my $i(1..$#arrays) { my @col = split(/,/,$arrays[$i]); for my $j (1..$#col) { $col[$j] =~ s/"//g; my $td = ($i==1 || $j==1)? "th" : "td"; my $bg = ($i==1)? "bgcolor=#e0e0e0" : "bgcolor=#ff +ffff"; print OUT "<$td $bg align = left>$col[$j]"}; }; }; }; print OUT "</table>"; print OUT "</body>"; print OUT "\n</HTML>\n"; close(OUT); #--------------------------------------------------------------------- +------ # This subroutine split text file to number of arrays # for data processing # -------------------------------------------------------------------- +------ sub build_hash() { my @tables; my %data; my $last =''; open my $ifh,'<',"C:/Perl-Script/Bulletin.txt"; while (my $line=<$ifh>) { chomp $line; if ( substr($line,0,2) eq '"$' || substr($line,0,1) eq '$') { $last=$line; push @tables,$line; } push @{$data{$last}},$line; return (%data); } #--------------------------------------------------------------------- +------ # This subroutine gets the local date and time using Time::Localtime m +odule and # formats it into dd/mm/yyyy and HH:mm. Returns $realTime, $realDate # -------------------------------------------------------------------- +------ sub GetTodaysDate($){ #For Testing my $source = "C:/Perl-Script/NBulletn.txt"; my $target = "C:/Perl-Script/Bulletin.html"; my $text_timestamp = ctime(stat($source)->mtime); my $html_timestamp = ctime(stat($target)->mtime); my ($WDATE, $MONTH, $DAY, $TIME,$YEAR) = split(" ",$html_timestamp); my $datelimtr = " "; my $dtdlimtr = "/"; my $tmdlimtr = ":"; my $realDate=($WDATE . $datelimtr . $DAY .$dtdlimtr . $MONTH . $dtdlim +tr . $YEAR); my $realTime=($TIME); return $realDate, $realTime; }
Nirvana is Now or Never

Replies are listed 'Best First'.
Re^3: split the text file to multiple arrays
by huck (Prior) on Jul 06, 2017 at 06:21 UTC
Re^3: split the text file to multiple arrays
by poj (Abbot) on Jul 06, 2017 at 07:32 UTC

    Your code does not compile

    Missing right curly or square bracket at 1194338.pl line 100, at end of line
    syntax error at 1194338.pl line 100, at EOF
    1194338.pl had compilation errors.
    

    Try

    #!/usr/bin/perl use strict; use warnings; use Time::Piece; # current date/time my $t = localtime; my $date = $t->wdayname.' '.$t->dmy('/'); my $time = $t->hms; # input data my $dest = "C:/Perl-Script/"; my %hdata = build_hash($dest."Bulletin.txt"); # output html open OUT, ">". $dest."Bulletin.html" or die "$!"; print OUT qq( <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head> <title>My Learning Page</title> <style type="text/css"> body { background-color: #ccccff; } h2 { color: #0; font-size: 2em; } th { background-color: #e0e0e0 } td { background-color: #ffffff } </style> </head> <body> <h2>My Home Page</h2> <h2>Bulletin Date $date $time</h2>\n); foreach my $key (sort keys %hdata) { if (($key eq '"$Persons Absences?"') || ($key eq '"$Replacement Persons?"') || ($key eq '"$Room Changes?"')){ print OUT qq!<h3>$key</h3> <table border="1" width="100%" style="border-color:#e0e0e0" cellpa +dding="5" align="left">\n!; my @arrays = @{$hdata{$key}}; for my $i (1..$#arrays) { print OUT '<tr>'; my @col = split(/,/,$arrays[$i]); for my $j (1..$#col) { $col[$j] =~ s/"//g; my $td = ($i==1)? "th" : "td"; print OUT qq!<$td align="left">$col[$j]</$td>!; }; print OUT "</tr>\n"; }; print OUT "</table>&nbsp;<br>\n"; }; } print OUT "</body></html>"; close OUT; #------------------------------------- # This subroutine split text file to # number of arrays for data processing # ------------------------------------- sub build_hash{ my $infile = shift; my %data; my $last =''; open my $ifh,'<',$infile or die "$!"; while (my $line=<$ifh>) { chomp $line; if ( substr($line,0,2) eq '"$' || substr($line,0,1) eq '$') { $last = $line; } push @{$data{$last}},$line; } close $ifh; return %data; }
    poj

      This week I am learning a lot from Huck and poj for data reference, hash of array and html presentation. I really appreciate it. The page looks fantastic. Both of you deserve a Zen Hug from me. However I have a three small questions: 1. Is there any way to get rid of the quotation mark, $ and ? in $key before displaying using reg expression I have tried $key =~ s/\"$/ / but cannot get rid of ?" on the right side 2. I understand that we can only sort the hash $key in alphabet order, but is there any way to list the title in the order that we want in html page. 3. I like to learn how to use perl modules, for example HTML-Table,HTML-Template v.....Where should I start?

      Nirvana is Now or Never

        Is there any way to get rid of the quotation mark, $ and ? in $key

        $key=~s/[\"\$\?]//g;

        is there any way to list the title in the order that we want

        Remember push @tables,$line;. that made an array in the order that the tables came in. This would print the tables in that order

        foreach my $key (@tables) {
        If you had an array
        my @order=('"$Persons Absences?"','"$Replacement Persons?"','"$Room Ch +anges?"'); foreach my $key (@order) {
        It would print them in that order.

        Where should I start?

        I like to start by googling for examples of other people already using them and reading that code