#!/usr/bin/perl -w use strict; use XBase; use IO::File; use Text::CSV_XS; $| = 1; my (%Config); $Config{'FromCSV'} = "101055.csv"; $Config{'ToDBF'} = "101055.DBF"; my ($dbf, $csv); $dbf = OpenDBF(%Config); $csv = OpenCSV(%Config); AddRecords($dbf, $csv, %Config); sub OpenDBF { my (%Config) = @_; my $table = new XBase $Config{'ToDBF'} or die XBase->errstr; return $table; } sub OpenCSV { my (%Config) = @_; my $handle = new IO::File; open($handle, $Config{'FromCSV'}) or die "Can't open CSV file"; return $handle; } sub AddRecords { my ($dbf, $csv, %Config) = @_; my (@fields, %Record, $Field, $line, @columns, $lineno, $col, @field_types, @d, $data); my $csvParser = Text::CSV_XS->new(); @fields = $dbf->field_names; @field_types = $dbf->field_types; $lineno = 0; while (! eof($csv)) { %Record = (); $line = <$csv>; chomp($line); $lineno ++; print "\r$lineno" if ($lineno % 1000 == 0); $csvParser->parse($line) or die "invalid csv line # $lineno"; @columns = $csvParser->fields; $col = 0; foreach $Field (@fields) { $data = shift(@columns); $data = $1 if ($data =~ /^(.*) +$/); undef $data if ($data eq ""); if ($field_types[$col] eq 'D') { # Alter MM/DD/YY to YYYYMMDD @d = split('/', $data); $d[2] += 100 if ($d[2] < 50); $d[2] += 1900; $data = $d[2] * 10000 + $d[0] * 100 + $d[1]; } $Record{$Field} = $data; $col ++; } $dbf->set_record_hash($dbf->last_record + 1, %Record); } print "\nDone.\n"; }