![]() |
reading input from a file - changing new line character
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 | |
Re: reading input from a file - changing new line character
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 |
Re: reading input from a file - changing new line character
hollyhawkins <holly.hawkins@ynhh.org> 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"; Variablenamessurearehardtoreadwhenyouwritethemlike that. 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 tadmc@augustmail.com Perl programming Fort Worth, Texas |
| All times are GMT. The time now is 06:39 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.