/[webpac]/trunk/all2xml.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/all2xml.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 320 by dpavlin, Sun Apr 18 00:57:39 2004 UTC revision 641 by dpavlin, Sun Jan 23 02:02:10 2005 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl -w  #!/usr/bin/perl -w
2    
3  use strict;  use strict;
4  use OpenIsis;  use Biblio::Isis;
5  use Getopt::Std;  use Getopt::Std;
6  use Data::Dumper;  use Data::Dumper;
7  use XML::Simple;  use XML::Simple;
# Line 22  die "FATAL: can't find configuration fil Line 22  die "FATAL: can't find configuration fil
22  my $config;  my $config;
23    
24  #use index_DBI;         # default DBI module for index  #use index_DBI;         # default DBI module for index
25  use index_DBI_cache;    # faster DBI module using memory cache  #use index_DBI_cache;   # faster DBI module using memory cache
26    use index_DBI_tag;      # tag support for indexes
27  my $index;  my $index;
28    
29  my %opts;  my %opts;
# Line 139  sub data2xml { Line 140  sub data2xml {
140                  } else {                  } else {
141                          print STDERR "WARNING: field '$field' doesn't have 'name' attribute!";                          print STDERR "WARNING: field '$field' doesn't have 'name' attribute!";
142                  }                  }
143    
144                  if ($field_name) {                  if ($field_name) {
145                            $field_name = x($field_name);
146                          if (! $last_field_name) {                          if (! $last_field_name) {
147                                  $last_field_name = x($field_name);                                  $last_field_name = $field_name;
148                                  return $last_field_name;                                  return $last_field_name;
149                          } elsif ($field_name ne $last_field_name) {                          } elsif ($field_name ne $last_field_name) {
150                                  $last_field_name = x($field_name);                                  $last_field_name = $field_name;
151                                  return $last_field_name;                                  return $last_field_name;
152                          }                          }
153                  }                  }
# Line 168  sub data2xml { Line 171  sub data2xml {
171                          ($s,$se,$d,$i) = (0,1,0,0);                          ($s,$se,$d,$i) = (0,1,0,0);
172                  } elsif (lc($type) =~ /^lookup/) {                  } elsif (lc($type) =~ /^lookup/) {
173                          ($s,$se,$d,$i,$il) = (0,1,0,0,1);                          ($s,$se,$d,$i,$il) = (0,1,0,0,1);
174                    } elsif ($type) {
175                            print STDERR "WARNING: unknown type: $type\n";
176                  }                  }
177                  return ($s,$se,$d,$i,$il);                  return ($s,$se,$d,$i,$il);
178          }          }
# Line 253  sub data2xml { Line 258  sub data2xml {
258                          # init vars so that we go into while...                          # init vars so that we go into while...
259                          ($swish,$display) = (1,1);                          ($swish,$display) = (1,1);
260    
                         # placeholder for all repeatable entries for index  
   
261                          sub mkformat($$) {                          sub mkformat($$) {
262                                  my $x = shift || die "mkformat needs tag reference";                                  my $x = shift || die "mkformat needs tag reference";
263                                  my $data = shift || return;                                  my $data = shift || return;
# Line 637  foreach my $database ($cfg->Sections) { Line 640  foreach my $database ($cfg->Sections) {
640          my $lookup_file = $cfg -> val($database, 'lookup_newfile'); # optional          my $lookup_file = $cfg -> val($database, 'lookup_newfile'); # optional
641          if ($lookup_file) {          if ($lookup_file) {
642                  #tie %lhash, 'GDBM_File', $lookup_file, &GDBM_NEWDB, 0644;                  #tie %lhash, 'GDBM_File', $lookup_file, &GDBM_NEWDB, 0644;
643                    if (! -e $lookup_file) {
644                            open(LOOKUP, "> $lookup_file") || die "can't create $lookup_file': $!";
645                            close(LOOKUP);
646                    }
647                  tie %lhash, 'TDB_File', $lookup_file, TDB_CLEAR_IF_FIRST, O_RDWR, 0644;                  tie %lhash, 'TDB_File', $lookup_file, TDB_CLEAR_IF_FIRST, O_RDWR, 0644;
648                  print STDERR "creating lookup file '$lookup_file'\n";                  print STDERR "creating lookup file '$lookup_file'\n";
649                  # delete memory cache for lookup file                  # delete memory cache for lookup file
# Line 659  print STDERR "reading ./import_xml/$type Line 666  print STDERR "reading ./import_xml/$type
666    
667          $config=XMLin("./import_xml/$type.xml", ForceArray => [ $type2tag{$type_base}, 'config', 'format' ], ForceContent => 1 );          $config=XMLin("./import_xml/$type.xml", ForceArray => [ $type2tag{$type_base}, 'config', 'format' ], ForceContent => 1 );
668    
669            # helper for progress bar
670            sub fmt_time {
671                    my $t = shift || 0;
672                    my $out = "";
673    
674                    my ($ss,$mm,$hh) = gmtime($t);
675                    $out .= "${hh}h" if ($hh);
676                    $out .= sprintf("%02d:%02d", $mm,$ss);
677                    $out .= "  " if ($hh == 0);
678                    return $out;
679            }
680    
681          # output current progress indicator          # output current progress indicator
682          my $last_p = 0;          my $last_p = 0;
683            my $start_t = time();
684          sub progress {          sub progress {
685                  return if (! $show_progress);                  return if (! $show_progress);
686                  my $current = shift;                  my $current = shift;
687                  my $total = shift || 1;                  my $total = shift || 1;
688                  my $p = int($current * 100 / $total);                  my $p = int($current * 100 / $total);
689                  if ($p != $last_p) {                  if ($p < $last_p || $current == 1) {
690                          printf STDERR ("%5d / %5d [%-51s] %-2d %% \r",$current,$total,"=" x ($p/2).">", $p );                          $start_t = time();
691                            $last_p = 0;
692                    } elsif ($p != $last_p) {
693                            my $rate = ($current / (time() - $start_t || 1));
694                            my $eta = ($total-$current) / ($rate || 1);
695                            printf STDERR ("%5d [%-38s] %-5d %0.1f/s %s\r",$current,"=" x ($p/3)."$p%>", $total, $rate, fmt_time($eta));
696                          $last_p = $p;                          $last_p = $p;
697                  }                  }
698          }          }
699    
700          my $fake_dir = 1;          my $fake_dir = 1;
701            my $fake_pos = 0;
702            my $last_fake_t = time();
703          sub fakeprogress {          sub fakeprogress {
704                  return if (! $show_progress);                  return if (! $show_progress);
705                  my $current = shift @_;                  my $current = shift @_;
706    
707                  my @ind = ('-','\\','|','/','-','\\','|','/', '-');                  my @ind = ('-','\\','|','/','-','\\','|','/');
708    
709                  $last_p += $fake_dir;                  if ($current < $fake_pos) {
710                  $fake_dir = -$fake_dir if ($last_p > 1000 || $last_p < 0);                          $start_t = time();
711                  if ($last_p % 10 == 0) {                          $last_fake_t = 0;
712                          printf STDERR ("%5d / %5s [%-51s]\r",$current,"?"," " x ($last_p/20).$ind[($last_p/20) % $#ind]);                          $fake_dir = 1;
713                            $fake_pos = 0;
714                    }
715    
716                    if (time()-$last_fake_t >= 1) {
717                            $last_fake_t = time();
718                            $fake_pos += $fake_dir;
719                            $fake_dir = -$fake_dir if ($fake_pos > 38);
720                    }
721    
722                    if ($current % 10 == 0) {
723                            my $rate = ($current / (time() - $start_t || 1));
724                            printf STDERR ("%5d [%-38s] %0.1f/s\r",$current, " " x $fake_pos .$ind[($current / 10) % 8], $rate);
725                  }                  }
726          }          }
727    
# Line 697  print STDERR "using: $type...\n"; Line 736  print STDERR "using: $type...\n";
736                  my $isis_db = $cfg -> val($database, 'isis_db') || die "$database doesn't have 'isis_db' defined!";                  my $isis_db = $cfg -> val($database, 'isis_db') || die "$database doesn't have 'isis_db' defined!";
737    
738                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);
739                  my $db = OpenIsis::open( $isis_db );                  my $db = new Biblio::Isis( isisdb => $isis_db );
   
                 # check if .txt database for OpenIsis is zero length,  
                 # if so, erase it and re-open database  
                 sub check_txt_db {  
                         my $isis_db = shift || die "need isis database name";  
                         my $reopen = 0;  
   
                         if (-e $isis_db.".TXT") {  
                                 print STDERR "WARNING: removing $isis_db.TXT OpenIsis database...\n";  
                                 unlink $isis_db.".TXT" || warn "FATAL: unlink error on '$isis_db.TXT': $!";  
                                 $reopen++;  
                         }  
                         if (-e $isis_db.".PTR") {  
                                 print STDERR "WARNING: removing $isis_db.PTR OpenIsis database...\n";  
                                 unlink $isis_db.".PTR" || warn "FATAL: unlink error on '$isis_db.PTR': $!";  
                                 $reopen++;  
                         }  
                         return OpenIsis::open( $isis_db ) if ($reopen);  
                 }  
   
                 # EOF error  
                 if ($db == -1) {  
                         $db = check_txt_db($isis_db);  
                         if ($db == -1) {  
                                 print STDERR "FATAL: OpenIsis can't open zero size file $isis_db\n";  
                                 next;  
                         }  
                 }  
740    
741                  # OpenIsis::ERR_BADF                  my $max_rowid = $db->count || die "can't find maxmfn";
                 if ($db == -4) {  
                         print STDERR "FATAL: OpenIsis can't find file $isis_db\n";  
                         next;  
                 # OpenIsis::ERR_IO  
                 } elsif ($db == -5) {  
                         print STDERR "FATAL: OpenIsis can't access file $isis_db\n";  
                         next;  
                 } elsif ($db < 0) {  
                         print STDERR "FATAL: OpenIsis unknown error $db with file $isis_db\n";  
                         next;  
                 }  
   
                 my $max_rowid = OpenIsis::maxRowid( $db );  
   
                 # if 0 records, try to rease isis .txt database  
                 if ($max_rowid == 0) {  
                         # force removal of database  
                         $db = check_txt_db($isis_db);  
                         $max_rowid = OpenIsis::maxRowid( $db );  
                 }  
742    
743                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";
744    
745                  my $path = $database;                  $path = $database;
746    
747                  for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {                  for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {
748                          my $row = OpenIsis::read( $db, $row_id );                          my $row = $db->to_hash( $row_id );
749                          if ($row && $row->{mfn}) {                          if ($row) {
750            
751                                    $row->{mfn} = $row_id;
752                                    $row->{record} = $db->{record};
753    
754                                  progress($row->{mfn}, $max_rowid);                                  progress($row->{mfn}, $max_rowid);
755    
756                                  my $swishpath = $path."#".int($row->{mfn});                                  my $swishpath = $path."#".int($row->{mfn});
# Line 770  print STDERR "using: $type...\n"; Line 764  print STDERR "using: $type...\n";
764                                  }                                  }
765                          }                          }
766                  }                  }
                 # for this to work with current version of OpenIsis (0.9.0)  
                 # you might need my patch from  
                 # http://www.rot13.org/~dpavlin/projects/openisis-0.9.0-perl_close.diff  
                 OpenIsis::close($db);  
767                  print STDERR "\n";                  print STDERR "\n";
768    
769          } elsif ($type_base eq "excel") {          } elsif ($type_base eq "excel") {
# Line 807  print STDERR "using: $type...\n"; Line 797  print STDERR "using: $type...\n";
797                          for(my $iC = $oWorksheet->{MinCol} ; defined $oWorksheet->{MaxCol} && $iC <= $oWorksheet->{MaxCol} ; $iC++) {                          for(my $iC = $oWorksheet->{MinCol} ; defined $oWorksheet->{MaxCol} && $iC <= $oWorksheet->{MaxCol} ; $iC++) {
798                                  my $cell = $oWorksheet->{Cells}[$iR][$iC];                                  my $cell = $oWorksheet->{Cells}[$iR][$iC];
799                                  if ($cell) {                                  if ($cell) {
800                                          $row->{int2col($iC)} = $cell->Value;                                          # this conversion is a cludge.
801                                            # Files from Excell could have
802                                            # characters which don't fit into
803                                            # destination encoding.
804                                            $row->{int2col($iC)} = $utf2cp->convert($cell->Value) || $cell->Value;
805                                  }                                  }
806                          }                          }
807    
# Line 833  print STDERR "using: $type...\n"; Line 827  print STDERR "using: $type...\n";
827                  }                  }
828          } elsif ($type_base eq "marc") {          } elsif ($type_base eq "marc") {
829    
830                  require MARC;                  require MARC::File::USMARC;
831                                    
832                  $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);
833                  my $marc_file = $cfg -> val($database, 'marc_file') || die "$database doesn't have 'marc_file' defined!";                  my $marc_file = $cfg -> val($database, 'marc_file') || die "$database doesn't have 'marc_file' defined!";
834    
835                  # optional argument is format                  # optional argument is format
836                  my $format = x($config->{marc_format}) || 'usmarc';                  warn "marc_format is no longer used!" if ($config->{marc_format});
   
837                  print STDERR "Reading MARC file '$marc_file'\n";                  print STDERR "Reading MARC file '$marc_file'\n";
838    
839                  my $marc = new MARC;                  my $marc = MARC::File::USMARC->in( $marc_file )
840                  my $nr = $marc->openmarc({                          || die "Can't open MARC file '$marc_file': ".$MARC::File::ERROR;
                                 file=>$marc_file, format=>$format  
                         }) || die "Can't open MARC file '$marc_file' with format '$format'";  
841    
842                  # read MARC file in memory                  # count records in MARC file
843                  $marc->nextmarc(-1);                  sub marc_count {
844                            my $filename = shift || die;
845                            my $file = MARC::File::USMARC->in($filename) || die $MARC::File::ERROR;
846                            my $count = 0;
847                            while ($file->skip()) {
848                                    $count++;
849                            }
850                            return $count;
851                    }
852    
853                  my $max_rec = $marc->marc_count();                  my $count = marc_count($marc_file) || warn "no records in '$marc_file'?";
854    
855                  for(my $i=1; $i<=$max_rec; $i++) {                  my $i = 0;
856    
857                          progress($i,$max_rec);                  while( my $rec = $marc->next() ) {
858    
859                          # store value for marc_sf.pm                          progress($i++,$count);
                         $main::cache->{marc_record} = $i;  
860    
861                          my $swishpath = $database."#".$i;                          my $swishpath = $database."#".$i;
862    
863                          if (my $xml = data2xml($type_base,$marc,$add_xml,$cfg,$database)) {                          if (my $xml = data2xml($type_base,$rec,$add_xml,$cfg,$database)) {
864                                  $xml = $cp2utf->convert($xml);                                  $xml = $cp2utf->convert($xml);
865                                  use bytes;      # as opposed to chars                                  use bytes;      # as opposed to chars
866                                  print "Path-Name: $swishpath\n";                                  print "Path-Name: $swishpath\n";
# Line 933  all2xml.pl - read various file formats a Line 931  all2xml.pl - read various file formats a
931    
932  =head1 DESCRIPTION  =head1 DESCRIPTION
933    
934  This command will read ISIS data file using OpenIsis perl module, MARC  This command will read ISIS data file using IsisDB perl module, MARC
935  records using MARC module and optionally Micro$oft Excel files to  records using MARC module and optionally Micro$oft Excel files to
936  create one XML file for usage with I<SWISH-E> indexer. Dispite it's name,  create one XML file for usage with I<SWISH-E> indexer. Dispite it's name,
937  this script B<isn't general xml generator> from isis files (isis allready  this script B<isn't general xml generator> from isis files (isis allready

Legend:
Removed from v.320  
changed lines
  Added in v.641

  ViewVC Help
Powered by ViewVC 1.1.26