3 # Parses Bibliofile files.
4 # Usage: parse_db.pl TITLE.DB
5 # Works fine on TITLE.DB, but misses the boat on other files; probably different block sizes or something.
11 my $startOfColumnTypes = 8;
12 my $startOfRealData = 4096;
14 my $initialOffset = 6;
35 $rowLength = ord substr($data, 0, 1);
36 #print "Row length: $rowLength\n";
38 my $numColumns = ord substr($data, 2, 1);
39 #print "Columns: $numColumns\n";
41 my $namedata = substr($data, $startOfColumnTypes + ($numColumns * 7) - 2);
42 @fieldNames = split(/\x00/, $namedata);
44 for (my $i = 0; $i < $numColumns; $i++) {
45 $fieldTypes[$i] = substr($data, ($i * 7) + $startOfColumnTypes, 1);
46 $fieldLengths[$i] = ord substr($data, ($i * 7) + $startOfColumnTypes + 1, 1);
53 print join("\t", @fieldNames) . "\n";
59 while (read DB, my $data, $blockSize) {
61 next if ($blocks == 1);
62 my $maxRecords = int( $blockSize / $rowLength);
63 my $indexIndicator = ord substr($data, 7, 1);
64 next if ($indexIndicator == 0);
66 # for (my $i = 1; $i <= scalar(@fieldLengths); $i++) {
67 # print "Field $i has length $fieldLengths[$i-1]\n";
70 for (my $r = 0; $r < $maxRecords; $r++) {
75 for (my $f = 0; $f < scalar(@fieldLengths); $f++) {
76 $field[$f] = substr($data, $initialOffset + ($r * $rowLength) + $pos, $fieldLengths[$f]);
77 if ($fieldTypes[$f] eq 'S') { $field[$f] = ord $field[$f]; }
78 $pos += $fieldLengths[$f];
81 if ($field[0] =~ m/[^\x00]/) {
82 print join("\t", @field) . "\n";