#!/usr/bin/perl use strict; my ($xml_source, $data_source, $filter_args) = @ARGV; #print "$xml_source\n"; #print "$data_source\n"; #print "$filter_args\n"; my @filter_args = split (/\,/, $filter_args); #call data args into scope from xml document use LWP::Simple; my $content; $content = get $xml_source; die "Couldn't get $xml_source" unless defined $content; use XML::Simple; my $xs1 = XML::Simple->new(); my $doc = $xs1->XMLin($content, forcearray => 1); =comment #to view the contents of the $doc array use Data::Dumper; print Dumper($doc); =cut my ($file_row_start, $file_row_comment, $file_field_separator, $file_field_missing_value, $column_time) ; my $file_row_start = $doc->{'global_attributes'}->[0]->{'file_row_start'}->[0] ; if ($file_row_start =~ /HASH/) { $file_row_start = 1; } #assumes 'none' won't actually be used as a line comment #not testing for escape characters my $file_row_comment = $doc->{'global_attributes'}->[0]->{'file_row_comment'}->[0] ; if ($file_row_comment =~ /HASH/) { $file_row_comment = 'none'; } #not testing for escape characters my $file_field_separator = $doc->{'global_attributes'}->[0]->{'file_field_separator'}->[0] ; #assumes 'none' won't actually be used as a missing value #not testing for escape characters my $file_field_missing_value = $doc->{'global_attributes'}->[0]->{'file_field_missing_value'}->[0] ; if ($file_field_missing_value =~ /HASH/) { $file_field_missing_value = 'none'; } my $column_time = $doc->{'global_attributes'}->[0]->{'column_time'}->[0] ; if ($column_time =~ /HASH/) { $column_time = 1; } my $measurement_time_zone = $doc->{'global_attributes'}->[0]->{'measurement_time_zone'}->[0] ; if ($measurement_time_zone =~ /HASH/) { $measurement_time_zone = '+00'; } #populate local array from ascii column data using xml file processing args $content = get $data_source; die "Couldn't get $data_source" unless defined $content; #split rows into array elements my @data_content = split (/\n/, $content); my @obs_values; my $number_file_columns; my $line; my @line_array; my $line_count_file = 0; my $line_count_processed = 0; foreach $line (@data_content) { $line_count_file++; #drop lines until first row start if ($line_count_file < $file_row_start) { next; } #skip lines which are commented if ($line =~ /^$file_row_comment/) { next; } #processing row #print "process\n"; $line_count_processed++; @line_array = split(/$file_field_separator/,$line); #map missing values #foreach my $element (@line_array) { # if ($element eq $file_field_missing_value) { $element = '-99999'; } #} push (@obs_values, @line_array); } my $number_file_columns = scalar(@line_array); #print "line_count_processed: $line_count_processed\n"; #now process populated array process_array_column(\@obs_values, $column_time); my $filename = 'filter_'.int(rand(10000000)); #create temp file open (TEMP_FILE, ">/tmp/ms_tmp/$filename\.txt"); print TEMP_FILE print_array(\@obs_values); close (TEMP_FILE); #create temp file ref open (TEMP_FILE, ">/tmp/ms_tmp/$filename\_ref.txt"); print TEMP_FILE "http://nautilus.baruch.sc.edu/ms_tmp/$filename\.txt"; close (TEMP_FILE); #the filename handle is passed back to the calling php page for reference print $filename; exit 0; sub process_array_column { my ($array_line, $get_column) = @_; my $column_count = 1; #print $measurement_time_zone; foreach my $element (@{$array_line}) { if ($column_count == $get_column) { if ($filter_args[0] eq 'breakoutYYYYMMDDHHMM') { $element = substr($element,0,4).'-'.substr($element,4,2).'-'.substr($element,6,2).' '.substr($element,8,2).':'.substr($element,10,2).':00'.$measurement_time_zone.'00'; } if ($filter_args[0] eq 'breakoutNormal') { $element = substr($element,0,19).$measurement_time_zone.'00'; } } $column_count++; if ($column_count == $number_file_columns+1) { $column_count = 1; } } } #process_array_column sub print_array { my ($array_line) = @_; my $column_count = 1; my $array_list = ''; foreach my $element (@{$array_line}) { $array_list .= $element; #if ($column_count != $number_file_columns) { $array_list .= field_separator_restore($file_field_separator); } if ($column_count != $number_file_columns) { $array_list .= "_SEP_"; } $column_count++; if ($column_count == $number_file_columns+1) { $column_count = 1; $array_list .= "\n"; } } return $array_list; } #print_array sub field_separator_restore { my ($field_separator) = @_; if ($field_separator eq '\,') { return ","; } if ($field_separator eq '\t') { return "\t"; } if ($field_separator eq '\s+') { return " "; } return $field_separator; }