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. Advertisements

  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. Advertisements

  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. Advertisements

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. Jeff Rodriguez

    Reading a file line by line... in reverse

    Jeff Rodriguez, Nov 27, 2003, in forum: C Programming
    Replies:
    4
    Views:
    520
    goose
    Nov 27, 2003
  2. reading line by line from file

    , Mar 29, 2006, in forum: C Programming
    Replies:
    20
    Views:
    843
    CBFalconer
    Mar 31, 2006
  3. KK
    Replies:
    1
    Views:
    356
    Victor Bazarov
    Sep 13, 2006
  4. Lee Sander
    Replies:
    6
    Views:
    484
    Hendrik van Rooyen
    Jun 1, 2007
  5. Steve Howell
    Replies:
    3
    Views:
    430
    George Sakkis
    Jun 2, 2007
  6. xyz
    Replies:
    3
    Views:
    757
  7. scad
    Replies:
    23
    Views:
    1,476
    Alf P. Steinbach
    May 17, 2009
  8. Bernd Fischer

    Reading config file with line break character?

    Bernd Fischer, Nov 10, 2006, in forum: Perl Misc
    Replies:
    3
    Views:
    227
    John W. Krahn
    Nov 10, 2006
Loading...