in reply to split the text file to multiple arrays

use strict; use warnings; my @tables; my %data; my $last=''; while (my $line=<DATA>) { chomp $line; if ( substr($line,0,2) eq '"$' || substr($line,0,1) eq '$') { $last=$line; push @tables,$line; } push @{$data{$last}},$line; } use Data::Dumper; print Dumper(\@tables); print Dumper(\%data); __DATA__ "$Bulletin Summary?" "$Person Absences?" "No","Person","Code","Period","Absence Reason" ...

Replies are listed 'Best First'.
Re^2: split the text file to multiple arrays
by mhoang (Acolyte) on Jul 06, 2017 at 05:10 UTC

    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

      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