reading input from a file - changing new line character

Discussion in 'Perl Misc' started by hollyhawkins, Dec 18, 2006.

  1. hollyhawkins

    hollyhawkins Guest

    I have an hl7 input file where the each segment used to be separated by
    a hex "0D", now each segment is separated with a hex "0A". The script
    used to read in the whole file as one record instead of parsing it out
    segment by segment, which is now happening with new x"0A" at the end of
    each segment. How can I change that and have the script read the file
    in as one record? Any help would be greatly appreciated. Thank you.


    Here is the code:
    Sample input - this editor a

    #!/usr/local/bin/perl

    #This script will read a directory containing individual records, write
    their
    #data contents to a single output file for input to elink. This was
    developed
    #for the transactions from QUEST to Logician. Sept 2005 Holly Hawkins

    #define the file directory paths

    $datainpath = "C:\\YNHH_Files\\Quest\\Quest_IN";
    $dataoutpath = "C:\\YNHH_Files\\Quest\\Quest_OUT";
    $tempdir = "C:\\YNHH_Files\\Quest\\temp";
    $archivedir = "C:\\YNHH_Files\\Quest\\archive";

    #open the directory that has the input files

    opendir THISDIR, "$datainpath" or die "Serious Error: $!";

    #read the names of the individual files into an array "@allfiles"

    @allfiles = grep !/^\.\.?$/, readdir THISDIR;

    closedir THISDIR;
    # the follwing line of code was entered by REV to prevent this script
    # from running if the dummyrec is the only file existent in the
    directory.
    if (@allfiles <= 1) {exit}

    #print "size of array: " . @allfiles . ".\n";

    #writes the names from the directory to a file in tempdir

    open RECORDNAMES, ">$tempdir\\recnames.txt" or die "Serious Error:
    $!";

    foreach $allfiles (@allfiles) {
    # if ($allfiles != '99999dummyrec.txt')
    {print RECORDNAMES "$allfiles\n"};
    # print "$allfiles\n";
    }

    #fileout has the names of the records to be deleted
    close "$tempdir\\recnames.txt";


    # now take the record names in RECORDNAMES,
    #and write the contents of the each of the records to another file.

    #open dataout.txt for the data from the records
    #the >> will open the file if it does not exist, or append to it
    #if it is there already

    #reopen filenames file as input

    open (RECORDNAMES, "$tempdir\\recnames.txt") or die "Serious Error:
    $!";
    open (OUTFILE, ">>$dataoutpath\\questout.txt") or die "cannot open
    questout.txt.\n";

    #write to the dataout.txt file

    select (OUTFILE);

    # Read the file of record names
    # open each file
    #write contents of file to the dataout.txt OUTFILE

    #=>>>>This is the problem - each segment is now read as a separate
    record, and written out #=>>>separtley - I want to read the file in one
    'chunk".

    while (<RECORDNAMES>) {
    $filename = "$datainpath\\$_";
    open (X, "$filename");
    while (<X>)

    # {if ($filename != "$datainpath\\99999dummyrec.txt")
    {print "\x0B$_\x1C\x0D"};


    # }
    }
    # just wrote all the contents of the files, close the output file
    dded an extra "0D" - strip that out if you want to replicate my
    problem.
    MSH|^~\&|LAB|QWA||226964|2006REC 1
    10449||ORU^R01|20061208578891130000|P|2.3|||||||
    PID|1|19230|VD441550||TEST^ALMA^G||19500506|F||||||||||2269640000212|047441174||||||||||||
    NTE|1|TX|NON-FASTING |
    hollyhawkins, Dec 18, 2006
    #1
    1. Advertising

  2. hollyhawkins

    Paul Lalli Guest

    hollyhawkins wrote:
    > I have an hl7 input file where the each segment used to be separated by
    > a hex "0D", now each segment is separated with a hex "0A". The script
    > used to read in the whole file as one record instead of parsing it out
    > segment by segment, which is now happening with new x"0A" at the end of
    > each segment. How can I change that and have the script read the file
    > in as one record? Any help would be greatly appreciated. Thank you.


    Please browse the Perl FAQ *before* posting.

    perldoc -q entire
    Found in /opt2/Perl5_8_4/lib/perl5/5.8.4/pod/perlfaq5.pod
    How can I read in an entire file all at once?

    Paul Lalli
    Paul Lalli, Dec 18, 2006
    #2
    1. Advertising

  3. hollyhawkins <> wrote:

    > I have an hl7 input file where the each segment used to be separated by
    > a hex "0D",



    Most people call that a "carriage return".


    > now each segment is separated with a hex "0A".



    Most people call that a "linefeed".


    > and have the script read the file
    > in as one record?



    See the $/ variable in:

    perldoc perlvar


    > $datainpath = "C:\\YNHH_Files\\Quest\\Quest_IN";



    Variablenamessurearehardtoreadwhenyouwritethemlikethat.

    You should use single quotes unless you _want_ one of the two extra
    things that double quotes give you.

    You can use sensibly-leaning slashes in filenames that are not
    going to be fed to the M$ "shell".


    $data_in_path = 'C:/YNHH_Files/Quest/Quest_IN';


    > opendir THISDIR, "$datainpath" or die "Serious Error: $!";



    Checking the return value. Good.

    Quoting a lone variable. Bad.

    See:

    perldoc -q vars

    What’s wrong with always quoting "$vars"?


    > @allfiles = grep !/^\.\.?$/, readdir THISDIR;



    I would suggest that these are easier to read and understand:

    @allfiles = grep $_ ne '.' and $_ ne '..', readdir THISDIR;
    or
    @allfiles = grep /^[.]{1,2}$/, readdir THISDIR;


    > open RECORDNAMES, ">$tempdir\\recnames.txt" or die "Serious Error:
    > $!";



    Checking the return value again. Good.


    > close "$tempdir\\recnames.txt";



    That statement was working OK for you?


    > open (RECORDNAMES, "$tempdir\\recnames.txt") or die "Serious Error:
    > $!";



    Checking the return value. Good.


    > open (OUTFILE, ">>$dataoutpath\\questout.txt") or die "cannot open
    > questout.txt.\n";



    Checking the return value. Good.


    > open (X, "$filename");



    Not checking the return value. Bad.

    You should choose a more meaningful filehandle name too.


    > # {if ($filename != "$datainpath\\99999dummyrec.txt")



    Perl has different operators for comparing numbers or for comparing strings.


    --
    Tad McClellan SGML consulting
    Perl programming
    Fort Worth, Texas
    Tad McClellan, Dec 19, 2006
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. KK
    Replies:
    1
    Views:
    284
    Victor Bazarov
    Sep 13, 2006
  2. Andreas Leitgeb
    Replies:
    0
    Views:
    433
    Andreas Leitgeb
    May 15, 2009
  3. Mark Space
    Replies:
    0
    Views:
    469
    Mark Space
    May 15, 2009
  4. Lew
    Replies:
    0
    Views:
    926
  5. Joshua Cranmer
    Replies:
    0
    Views:
    449
    Joshua Cranmer
    May 15, 2009
Loading...

Share This Page