First version of a utility to convert Athena DBF to TSV suitable for \copy.
authorBen Ostrowsky <ben@esilibrary.com>
Tue, 6 Apr 2010 14:23:16 +0000 (14:23 +0000)
committerBen Ostrowsky <ben@esilibrary.com>
Tue, 6 Apr 2010 14:23:16 +0000 (14:23 +0000)
Suitable includes escaping backslash, tab, newline, and carriage return,
and converting output to UTF-8.

athena/athena-dbf-to-tsv.pl [new file with mode: 0755]

diff --git a/athena/athena-dbf-to-tsv.pl b/athena/athena-dbf-to-tsv.pl
new file mode 100755 (executable)
index 0000000..3455d4c
--- /dev/null
@@ -0,0 +1,44 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use XBase;  # or could use DBI and DBD::XBase;
+use Data::Dumper;
+use Getopt::Long;
+use Encode;
+
+my $in = '';
+my $out = '';
+GetOptions('in=s' => \$in, 'out=s' => \$out);
+
+open OUT, ">$out" or die $!;
+
+my $table = new XBase $in or die XBase->errstr;
+
+# get list of field names
+my @names = $table->field_names;
+
+# dump PATRONID, SURNAME, FIRSTNAME
+print OUT join ("\t", @names) . "\n";
+
+sub clean {
+  if ( $_ ) { 
+    s/\\/\\\\/g;
+    s/\n/\\n/g; 
+    s/\r/\\r/g; 
+    s/\t/\\t/g; 
+    Encode::encode("utf8", $_) 
+  } else { ''; } # to avoid 'Use of uninitialized value in join'
+}
+
+my $i = 0;
+for (0 .. $table->last_record) {
+    $i++;
+    my ($deleted, @row) = $table->get_record($_);
+    @row = map (&clean, @row); 
+    print OUT join("\t", @row) . "\n" unless $deleted;
+
+}
+
+print STDERR "$i records exported to $out.\n";