#!/usr/local/bin/perl use strict ; use warnings ; use File::Slurp ; use Data::Dumper ; require template ; my %abbrev2state = ( AL => 'ALABAMA', AK => 'ALASKA', AZ => 'ARIZONA', AR => 'ARKANSAS', CA => 'CALIFORNIA', CO => 'COLORADO', CT => 'CONNECTICUT', DE => 'DELAWARE', DC => 'DISTRICT OF COLUMBIA', FL => 'FLORIDA', GA => 'GEORGIA', HI => 'HAWAII', ID => 'IDAHO', IL => 'ILLINOIS', IN => 'INDIANA', IA => 'IOWA', KS => 'KANSAS', KY => 'KENTUCKY', LA => 'LOUISIANA', ME => 'MAINE', MD => 'MARYLAND', MA => 'MASSACHUSETTS', MI => 'MICHIGAN', MN => 'MINNESOTA', MS => 'MISSISSIPPI', MO => 'MISSOURI', MT => 'MONTANA', 'NE' => 'NEBRASKA', NV => 'NEVADA', NH => 'NEW HAMPSHIRE', NJ => 'NEW JERSEY', NM => 'NEW MEXICO', NY => 'NEW YORK', NC => 'NORTH CAROLINA', ND => 'NORTH DAKOTA', OH => 'OHIO', OK => 'OKLAHOMA', OR => 'OREGON', PA => 'PENNSYLVANIA', RI => 'RHODE ISLAND', SC => 'SOUTH CAROLINA', SD => 'SOUTH DAKOTA', TN => 'TENNESSEE', TX => 'TEXAS', UT => 'UTAH', VT => 'VERMONT', VI => 'VIRGIN ISLANDS', VA => 'VIRGINIA', WA => 'WASHINGTON', WV => 'WEST VIRGINIA', WI => 'WISCONSIN', WY => 'WYOMING', ) ; my @fields_names = qw( NAME ADDRESS1.1 ADDRESS2.1 CITY.1 STATE.1 ZIP.1 PHONE1 ADDRESS1.2 ADDRESS2.2 CITY.2 STATE.2 ZIP.2 TYPE ) ; # COUNTRY.1 # COUNTRY.2 my $template_file = shift || '/local/apache/htdocs/sysarch/cocoa/products_retail.html' ; my $template = read_file( $template_file ) ; my $businesses = parse_businesses() ; my $params = organize_businesses( $businesses ) ; print expand_template( $template, $params ) ; exit ; sub parse_csv { my $line = <> ; return unless defined $line ; #warn $line ; chomp $line ; my %record ; @record{ @fields_names } = split( /\t/, $line ) ; my $suffix = $record{ 'ADDRESS1.2' } ? '2' : '1' ; # my $suffix = defined( $record{ 'ADDRESS1.2' } ) ? '2' : '1' ; $record{ $_ } = $record{ "$_.$suffix" } for qw( ADDRESS1 ADDRESS2 CITY STATE ZIP ) ; #warn Dumper \%record ; return \%record ; } sub parse_record { local $/ = '' ; my $chunk = <> ; my $record ; while ( $chunk =~ /^(\w+):\s+?(.*?)\n/mg ) { $record->{ uc $1 } = $2 ; } return $record ; } sub parse_businesses { my @businesses ; # while( my $record = parse_record() ) { while( my $record = parse_csv() ) { # for my $required ( qw( NAME ADDRESS1 CITY STATE ZIP # PHONE1 TYPE ) ) { # $record->{$required} or # warn "\nField '$required' is not in \n$chunk" ; # } push @businesses, $record ; } return \@businesses ; } sub organize_businesses { my ( $businesses ) = @_ ; my $states ; foreach my $business ( @{$businesses} ) { my $state = $business->{STATE} || 'XX' ; push( @{$states->{$state}}, $business ) ; } my @state_params ; foreach my $abbrev ( sort keys %{$states} ) { my @sorted_businesses = sort { $a->{CITY} cmp $b->{CITY} } @{$states->{$abbrev}} ; my $i = 0 ; foreach my $business ( @sorted_businesses ) { $business->{BUSINESS_BGCOLOR} = $i++ % 2 ? 'white' : 'lightyellow' ; $business->{ABBREV} = $business->{STATE} ; # $business->{HREF} = "http://$business->{WEB}" # if $business->{WEB} ; } push( @state_params, { STATE => $abbrev2state{$abbrev}, ABBREV => $abbrev, BUSINESS => \@sorted_businesses, } ) ; } my @abbrev_params = map { ABBREV => $_->{ABBREV}}, @state_params ; return { STATE => \@state_params, STATE_LINK => \@abbrev_params, } ; }