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 |
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
> 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
ta...@augustmail.com Perl programming
Fort Worth, Texas