#!/usr/bin/perl -w
use strict;
my $records_out = 0;
# Did they not tell us what to use?
if (@ARGV != 2) {
die("$0 - No file to process or output.\n");
}
# Get total size, in bytes, of file for percentage counter
my @stat = stat($ARGV[0]);
my $total_bytes = $stat[7];
$| = 1; # Autoflush output
open(IN, $ARGV[0]) || die("$0 - Cannot open $ARGV[0].\n");
open(OUT, ">$ARGV[1]");
print "Dumping Account holder name and Account number from $ARGV[0]...
+\n";
print "Outputting to $ARGV[1]\n";
my $read_bytes = 0;
my $page_contents = '';
my $read_pages = 1;
for(;;) {
my $EOF = read(IN, my $char, 1);
last if ($EOF == 0);
if (substr($char, 0, 1) =~ /\x0c/) {
my @temp = split(/\n/, $page_contents); # Split lines
+up
my $line_count = @temp;
next if $line_count < 2;
# Get name, address, city, state & zipcode from page
my $name = substr($temp[58], 5, 30);
my $addr = substr($temp[59], 5, 30);
my $addr2 = substr($temp[60], 5, 30);
my ($city, $state) = split(/\,/, substr($temp[61], 5,
+20));
my $zip = substr($temp[61], 26, 5);
$addr = &normalise($addr);
$addr2 =&normalise($addr2);
$city = &normalise($city);
$state = &normalise($state);
$zip = &normalise($zip);
&format($name, $addr, $addr2, $city, $state, $zip);
$read_pages++;
$page_contents = '';
}
$page_contents .= $char; # Push char on
+to page
# Do percentage display
$read_bytes++;
my $percent = $read_bytes / $total_bytes * 100; # Work out per
+centage
$percent = sprintf("%.2f", $percent); # Set to 2 dp
print "$percent%\r";
}
$read_pages++;
close(IN);
close(OUT);
print "\n-> Read $read_pages pages, and dumped $records_out records ou
+t.\n";
exit(0);
# Format data into ANCOA import standard
sub format {
my ($name, $addr, $addr2, $city, $state, $zip) = @_;
my $record = "1"; # Record Type
$record .= &pad($name, 35);
$record .= &pad($addr, 30);
$record .= &pad($addr2, 30);
$record .= &pad($city, 30);
$record .= &pad($state, 2);
$record .= &pad($zip, 5);
$record .= &pad(" ", 342); # Empty Optional Customer Info
my $len = length($record);
print OUT "$record";
$records_out++;
}
# Pad out with trailing whitespace as necessary
sub pad {
my ($data, $len) = @_;
while(length($data) < $len) {
$data .= " ";
}
return $data;
}
# Get rid of leading/trailing whitespace
sub normalise {
my ($value) = @_;
if (defined $value) {
for(my $i = 0; $i <= length($value); $i++) {
if (substr($value, $i, 1) ne " ") {
$value = substr($value, $i, length($value));
last;
}
}
for(my $i = length($value); $i >= 0; $i--) {
next if substr($value, $i, 1) eq "";
if (substr($value, $i, 1) ne " ") {
$value = substr($value, 0, $i + 1);
last;
}
}
}
return $value;
}
JP |