#!/usr/bin/perl -w use strict; use warnings; use POSIX qw(strftime); use constant FILEHDR => 66; use constant DATALEN => 222; use constant FILETRL => 69; use Cwd; use Getopt::Long; my @hdrname = ( "Record Type", "Date", "Record Size", "Number Record", "Application", "Version", "Data Rec. Type", "Extra", "Byte", "newLine" ); my @hdrsize = (3, 14, 4, 8, 16, 5, 3, 8, 4, 2); my $data; my @trlname = ( "Record Type", "Date", "Record Size", "Number Record", "Application", "Version", "Data Rec. Type", "Extra", "newLine" ); my @trlsize = (6, 28, 8, 14, 32, 10, 6, 32, 2); my @dataname = ( "Record Type", "IRVC Key", "Card Number", "Serial Number", "Issue Code", "Lot Number", "Source Zone", "Destination Zone", "Caller Number", "Dialed Number", "Convention Time", "Call connect Time", "Call Release Time", "Valued Deducted", "Breakage Value", "MBI", "Carrier", "Carriage Return" ); my @datasize = (4, 24, 32, 32, 32, 16, 32, 32, 40, 40, 24, 28, 28, 18, 18, 10, 32, 2 ); my ($help,$raw,$std,$input,$output,$fname); GetOptions ( "h|help" => \$help, "raw|r" => \$raw, "std|s" => \$std, "input|i=s" => \$input, "output|o=s" => \$output, "filename|f=s" => \$fname, ) or usage(); sub usage { if ($help) { open (HELP, ">/tmp/help.txt"); print (HELP "USAGE: $0 -[hrs] -i -o -f \n"); print (HELP "Try \"-h\" or \"--help\" for more information\n\n"); print (HELP "NAME\n"); print (HELP "\t$0 - encode SINGTEL Data Format\n\n"); print (HELP "DESCRIPTION\n"); print (HELP "\t-f or --filename : Assigned input file name\n"); print (HELP "\t-i or --input : Assigned input directory for the input file\n"); print (HELP "\t-o or --output : Assigned output directory\n"); print (HELP "\t-r : Display raw record\n"); print (HELP "\t-s : Display standard record\n\n"); print (HELP "EXAMPLE\n"); print (HELP "\t>> Display SINGTEL record in standard output\n"); print (HELP "\t\t $0 -s -f UNICA.0352.20091214\n\n"); print (HELP "\t>> Display SINGTEL record including raw record\n"); print (HELP "\t\t $0 -r -f UNICA.0352.20091214\n\n"); print (HELP "\t>> Convert SINGTEL record into CSV file format\n"); print (HELP "\t\t $0 -f UNICA.0352.20091214\n\n"); print (HELP "\t>> Convert SINGTEL record into CSV format and save into output directory\n"); print (HELP "\t\t $0 -i /input/directory/name/only -f UNICA.0352.20091214 -o /output/directory/name/only\n\n"); close (HELP); system ("more /tmp/help.txt"); system ("rm -f /tmp/help.txt"); } else { print ("USAGE: $0 -[hrs] -i -o -f \n"); print ("Try \"-h\" or \"--help\" for more information\n\n"); } } # Convert each two-digit hex number back to an ASCII character. sub hextoasc { (my $asc = shift) =~ s/([a-fA-F0-9]{2})/chr(hex $1)/eg; return $asc; } sub print_header { my $data = shift; my $loc = 0; my $nloc = 0; my $filehdr = unpack "A*", $data; my $fileval = unpack "H*", $data; print ("FILE HEADER\n"); for (my $i = 0; $i < @hdrname; $i++) { my $len = $hdrsize[$i]; if ($hdrname[$i] =~ /newLine/) { printf (" %-20s : %-15s >%s<\n", $hdrname[$i], substr($fileval,$nloc,$len*2), substr($fileval, $nloc, $len*2)); } else { printf (" %-20s : %-15s >%s<\n", $hdrname[$i], substr($filehdr, $loc, $len), substr($fileval, $nloc, $len*2)); } $loc = $loc + $len; $nloc = $nloc + $len * 2; } } sub print_trailer { my $data = shift; my $loc = 0; my $trlhdr = unpack "A*", $data; my $trlval = unpack "H*", $data; print ("FILE HEADER\n"); for (my $i = 0; $i < @trlname; $i++) { my $len = $trlsize[$i]; if ($trlname[$i] =~ /newLine/) { printf (" %-20s : %-15s >%s<\n", $trlname[$i], substr($trlval,$loc,$len*2), substr($trlval, $loc, $len)); } else { printf (" %-20s : %-15s >%s<\n", $trlname[$i], hextoasc(substr($trlhdr, $loc, $len)), substr($trlhdr, $loc, $len)); } $loc = $loc + $len; } } sub display_data { my $data = shift; my $val; my $tmp; my $cdr; my $loc = 0; print ("\nDATA\n") if ($raw); for (my $i = 0; $i < @dataname; $i++) { my $len = $datasize[$i]; my $fname = $dataname[$i]; if (uc($fname) =~ /RECORD TYPE|CANCEL TYPE/) { $cdr = hextoasc (substr($data, $loc, $len)); $val = substr($data, $loc, $len); } elsif (uc($fname) =~ /RECORD NUMBER/) { $cdr = hextoasc (substr($data, $loc, $len)); $val = substr($data, $loc, $len); } else { $cdr = hextoasc (substr($data, $loc, $len)); $val = substr($data, $loc, $len); } $cdr =~ s/\s+//g; $val =~ s/\s+//g; if ($raw) { printf (" %-20s: %-25s >%s<\n", $fname, $cdr, $val); } elsif ($std) { printf (" %-20s: %-25s\n", $fname, $cdr); } else { if ($output) { printf (OUTPUT "%s,", $cdr); } else { printf ("%s,", $cdr); } } $loc = $loc + $len; } if ($output) { print (OUTPUT "\n"); } else { print "\n"; } } #################################### MAIN ############################ # $dir = getcwd; if ($fname) { if (!defined ($input)) { $input = getcwd; } if (defined ($output)) { open (OUTPUT, ">$output/$fname.csv"); } open (DATA, "$input/$fname"); binmode DATA; read (DATA, $data, FILEHDR); print_header($data) if ($raw); while (read (DATA, $data, DATALEN) != 0) { my $hex = unpack "H*", $data; my $rtype = hextoasc (substr($hex, 0, 2)); if ($rtype =~ /T/) { print_trailer($hex) if ($raw); } else { display_data($hex); } } close(DATA); close(OUTPUT) if ($output); } else { usage(); }