I have a project that uses a socket server (php) to gather data from a remote device. It got put on the back burner for a few months and now it's back in play. What I'm wondering is how can I make this program run directly on the stream instead of first having the server write to a tmp file then running this script on that file then writing out a csv file for insertion into a database? Here's what I have so far ( I wind up with two tmp files after this is run):

#vim set sw=2 ts=2 #!/usr/bin/perl use warnings; use strict; use Data::Dumper; &convert; #open the source file, strip out any unneeded chars, reformat the data sub convert{ my $source = "$ARGV[0]"; my $dest = "$ARGV[0]"."_tmp.txt"; chomp $source; open SOURCE, '<', $source or die "Cannot open '$source' $!"; open DEST, '>', $dest or die "Could not open '$dest' $!"; # move the data from the source file into an array my %fields; my @field_names = qw/FIELD1 FIELD2 FIELD3 FIELD4 FIELD5 FIELD6/; my $pack_definition = 'a4 a2 a1 a4 a4 a8A*'; while(<SOURCE>){ # strip out the packet header s#T18##g; s#T00##g; s/^(FF14).*$//g; s/^(FF18).*$//g; s/(^|\n)[\n\s]*/$1/g; # arrange the data into the necessary order @fields{@field_names} = unpack($pack_definition, $_); s#(FF15)(.{2})(.{1})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2 +})#$1\t$2\t$3\t$5$4\t$7$6\t$11$10$9$8#g; s#(FF16)(.{2})(.{1})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})(.{2 +})#$1\t$2\t$3\t$4\t$5\t$6\t$7\t$8\t$9\t$10\t$11#g; s#(FF17)(.{2})(.{1})(.{2})(.{2})(.{2})(.{2})(.{4})(.{4})#$1\t$2\t$ +3\t$5$4\t$7$6\t$8\t$9#g; my @spds = /(FF15)\t(.{2})\t(.{1})\t(.{4})\t(.{4})\t(.{8})/; # convert the data from hex to ascii foreach my $data (@spds){ my $replacement = hex($data); s#$data#$replacement#g; } my @psis = /(FF16)\t(.{2})\t(.{1})\t(.{2})\t(.{2})\t(.{2})\t(.{2}) +\t(.{2})\t(.{2})\t(.{2})\t(.{2})/; foreach my $data1(@psis){ my $replacement1 = hex($data1); s#$data1#$replacement1#g; } my @rates= /(FF17)\t(.{2})\t(.{1})\t(.{4})\t(.{1,4})\t(.{4})\t(.{ +4})/; foreach my $data2 (@rates){ my $replacement2 = hex($data2); s#$data2#$replacement2#g; } # print the converted data to the destination file print DEST; } # close the files close SOURCE; close DEST; } &create_vals; # perform conversion from raw values to human readable output sub create_vals{ my $source = "$ARGV[0]"."_tmp.txt"; my $dest = "$ARGV[0]"."_converted.txt"; chomp $source; open SOURCE, '<', $source or die "Cannot open '$source' $!"; open DEST, '>', $dest or die "Cannot open '$dest' for writing $!"; while(<SOURCE>){ s#(65301)\t(.{2})\t(8)\t(.{1,5})\t(.{1,5})\t(.{1,4})#"'".$1."','". + $2."','". $3."','". ($4/8)."','". ($5/8)."','". ($6/20)."'"#eg; s#(65302)\t(.{2})\t(8)\t(.{1,3})\t(.{1,3})\t(.{1,3})\t(.{1,3})\t(. +{1,3})\t(.{1,3})\t(.{1,3})\t(.{1,3})#"'".$1."','". $2."','". $3."','" +. $4."','". (($5*1.8)-40)."','". (($6*1.8)-40)."','". ($7*.58)."','". +($8*.58)."','".($9*.29008)."','".(($10*1.8)-40)."','".$11."'"#eg; s#(65303)\t(.{2})\t(8)\t(.{1,5})\t(.{1,5})\t(.{1,5})\t(.{1,5})#"'" +.$1."','". $2."','". $3."','". ($4*0.014)."','". ($5*.05)."'"#eg; print DEST; } } close SOURCE; close DEST; __END__

Also, If anyone has any pointers on how to clean this up it would be appreciated as I'm sure that this isn't the most efficient way to handle this (I am still very much a Perl n00b ;-))


In reply to Handling stream data from socket server by lmrd_1

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.