As I deal with this all the time I've started including code to spit out these
records into their own file. That has been very useful:
my $batch = MARC::Batch->new('USMARC', '../full_export.out');
$batch->strict_off();
$batch->warnings_off();
my ($record, $counter, @rejected_record_counter);
eval { $record = $batch->next; };
while ($record) {
$counter++;
if ($@) {
print STDERR "Runtime error record $counter: $@\n";
push @rejected_record_counter, $counter;
eval { $record = $batch->next; };
next;
}
# Continue to process valid records ...
eval { $record = $batch->next; };
}
# Processing complete.
# Now split the input file into records and loop through to spit out the bad
ones
if (@rejected_record_counter) {
open (REJECTS, ">badrecs.marc") or die "Couldn't open badrecs.marc for
writing: $!\n";
local $/ = "\x1E\x1D";
open (INFILE, '../full_export.out') or die "Couldn't open ../full_export.out
for reading: $!\n";
my $record_counter;
while (my $record = <INFILE>) {
$record_counter++;
if ($record_counter == $rejected_record_counter[0]) {
print REJECTS $record;
shift @rejected_record_counter;
last unless @rejected_record_counter;
}
}
close (INFILE);
close (REJECTS);
}
Arvin
On Oct 13, 2011, Zhang, Bin <[email protected]> wrote:
Hi,
I have to admit my Perl skill is very limited, so this may be a dumb question,
but I can't seem to find answer. When I use MARC::Batch to read records from
our catalog (III) export file, I can't seem to find a way to skip an error
record. When I ran the following against an III export MARC file, it stopped
at a record with error.
utf8 "\xBC" does not map to Unicode at /usr/lib/perl/5.10/Encode.pm line 174.
Ideally I would like to be able to log the error and move to the next record.
Any help you can offer is greatly appreciated!
--script--
my $batch = MARC::Batch->new('USMARC', '../full_export.out');
$batch->strict_off();
$batch->warnings_off();
my $linter = MARC::Lint->new();
my $counter = 0;
while(my $record = $batch->next() ) {
$counter++;
if($counter != 22507) {
$linter->check_record($record);
my @warnings = $linter->warnings();
if(@warnings) {
print "RECORD $counter\n";
print join("\n", @warnings), "\n";
}
}
}
---
Bin Zhang
Digital Information Services Librarian
Library 3501D
Library Systems & IT Services, University Library
California State University, Sacramento
2000 State University Drive East, Sacramento, CA 95819-6039
(916) 278-5664 (O); (916) 278-3891 (F)
bzhang AT csus DOT edu