oceanborn

Perl XLS parsing and JSON example

Mar 31st, 2021 (edited)
506
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.46 KB | None | 0 0
  1. # https://gist.githubusercontent.com/oceanborn2/4af875cb33fe7197b8508a451d2b7b2b/raw/befb7d574f4bd7a9b57274d6d57d8a4ddfb0810a/mkjson.pl
  2.  
  3. #! perl.exe
  4.  
  5. use strict;
  6. use warnings FATAL => 'all';
  7. use Encode;
  8. use Cwd;
  9. use utf8;
  10. use Spreadsheet::ParseExcel;
  11.  
  12. sub getVal {
  13.     my $cell = shift;
  14.     return "" unless defined($cell);
  15.     return $cell->value();
  16. }
  17.  
  18. sub readExcel {
  19.     my $fname = shift;
  20.     my $parser = Spreadsheet::ParseExcel->new();
  21.     my $workbook = $parser->parse($fname);
  22.     if (!defined $workbook) {
  23.         die $parser->error(), ".\n";
  24.     }
  25.  
  26.     my @rows;
  27.     my $worksheet = $workbook->worksheet(0);
  28.  
  29.     #for my $worksheet ($workbook->worksheets()) {
  30.  
  31.     my ( $row_min, $row_max ) = $worksheet->row_range();
  32.  
  33.     for my $row ($row_min .. $row_max) {
  34.         next if ($row == 0); # ignoring header
  35.         my %vals;
  36.         $vals{Key} = getVal($worksheet->get_cell($row, 0));
  37.         $vals{Action} = getVal($worksheet->get_cell($row, 1));
  38.         $vals{LG} = getVal($worksheet->get_cell($row, 2));
  39.         $vals{Case} = getVal($worksheet->get_cell($row, 3));
  40.         $vals{PropKey} = getVal($worksheet->get_cell($row, 4));
  41.         $vals{"en-US"} = getVal($worksheet->get_cell($row, 5));
  42.         $vals{"fr-FR"} = getVal($worksheet->get_cell($row, 6));
  43.         $vals{PrevFR} = getVal($worksheet->get_cell($row, 7));
  44.         $vals{Alt} = getVal($worksheet->get_cell($row, 8));
  45.         $vals{Comment} = getVal($worksheet->get_cell($row, 9));
  46.         push(@rows, \%vals);
  47.     }
  48.     #}
  49.     @rows;
  50. }
  51.  
  52. sub writeJSON {
  53.     my $fname = shift;
  54.     open(my $fh, "> $fname") or die "err: $!";
  55.     binmode $fh, ":utf8";
  56.     my $lines = shift;
  57.     my @res = map {
  58.         my $hr = $_;
  59.         eval {
  60.             my $k = $hr->{Key};
  61.             chomp($k);
  62.  
  63.             my $v = $hr->{"fr-FR"};
  64.             chomp($v);
  65.  
  66.             while ($v =~ m/\r/og) {$v =~ s/\r//og;}
  67.             while ($v =~ m/\n/og) {$v =~ s/\n//og;}
  68.             while ($k =~ m/"/og) {$k =~ s/"//og;}
  69.             while ($v =~ m/"/og) {$v =~ s/"//og;}
  70.             $v = "" unless (defined($v));
  71.             $k = "" unless (defined($k));
  72.             $_ = "\t\t\"$k\" : \"$v\"";
  73.         };
  74.         my $res = $_;
  75.         if ($@) {
  76.             local $_ = $@;
  77.             print STDERR $@ . "\n";
  78.         }
  79.         else {
  80.             $res;
  81.         }
  82.     } @$lines;
  83.  
  84.     print $fh "{\n";
  85.     print $fh join(",\n", @res);
  86.     print $fh "\n\n}\n";
  87.     close($fh);
  88. }
  89.  
  90. my $currdir = getcwd;
  91.  
  92. my $infname = "${currdir}/CDNContent.xls";
  93. my $outfname = "${currdir}/fr-FR.json";
  94. my $outfnameAdd = "${currdir}/fr-FR_extra.json";
  95.  
  96. #my $csv = Text::CSV::Encoded->new ({
  97. #    encoding_in  => 'windows-1252',
  98. #    encoding_out => 'utf-8',
  99. #    sep_char     => ';',
  100. #    quote_char   => '"',
  101. #    binary       => 0,
  102. #});
  103. #
  104. ## read the input file into an array of hashes
  105. #open (my $fin, $infname) or die "err:$!";
  106. #my @hfields = $csv->getline($fin);
  107. #$csv->column_names(@hfields);
  108. #my @lines;
  109. #while (my $hr = $csv->getline_hr($fin)) {
  110. #    push(@lines, $hr);
  111. #}
  112. my @lines = readExcel($infname);
  113.  
  114. my @selok = grep {my $hr = $_;
  115.     my $act = $hr->{Action};
  116.     $hr if ($act =~ m/[NUGMK]+/og);
  117. } @lines;
  118.  
  119. my @seloth = grep {my $hr = $_;
  120.     my $act = $hr->{Action};
  121.     $hr if ($act !~ m/[NUGMK]+/og);
  122. } @lines;
  123.  
  124. print "selok: " . scalar @selok . "\r\n";
  125. print "seloth: " . scalar @seloth . "\r\n";
  126.  
  127. writeJSON($outfname, \@selok);
  128. writeJSON($outfnameAdd, \@seloth);
  129.  
  130.  
Add Comment
Please, Sign In to add comment