reading input from a file - changing new line character

H

hollyhawkins

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 |
 
P

Paul Lalli

hollyhawkins said:
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
 
T

Tad McClellan

hollyhawkins said:
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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top