HP OpenVMS Systemsask the wizard |
The Question is: How can I convert a 512-byte fixed-length file to 227-byte fixed-length. The Answer is :
You would have to define exactly how the mapping is supposed to happen.
You will also want to consider the sequence of events leading up to
this mismatch, particularly if network file transfers are occuring.
For example, if only the first 227 bytes of each input record are
needed, then a simple convert with truncate will do:
$CONVER/FDL=SYS$INPUT/TRUNCATE/STAT input.tmp output.tmp
record; fomat fixed; size 227
$
If the 512-byte record file is really a 'byte stream' and needs to be
chopped up in a 227 byte morsels, then you'll have to make a program
in the langue of your preference to read the input, and reorganize the
data into the desired output format. A DCL sample is attached.
For EVEN byte counts, one can merely change the file attributes to
indicate the new record length:
$SET FILE/ATTRI=(MRS=256,LRL=256)
However, for historical performance reasons, RMS starts records in
a fixed and vairable length record files at 'word' boundaries: even.
It will expexct/insert a FILL byte for odd record lengths.
Sometimes the EXCHANGE/NET [/transfer=record] tool can be used to
alter files to become acceptable for the receiving end, but not in
this case.
Sometimes, you can simply declare the file as a byte stream
SET FILE/ATT=RFM=UDF
but comparitively few applications will honor this.
Depending on what you are up to, a ZIP or a BACKUP saveset or similar
omnibus file can be of use, particularly if you use a tool that will
preserve OpenVMS file attributes. (This assumes that the fixed-length
512-byte transfer is occuring as a result of a network file transfer or
other potential source of a record attributes corruption.)
Alternatively, modifications to the application(s) -- to increase the
tolerance of differing record formats -- could be required here.
$set noon
$open/read input input.tmp
$create/fdl=sys$input output.tmp
record; format fixed; size 227
$open/append output output.tmp
$data = ""
$n = 0
$loop:
$ l = f$len(data)
$ if l.ge.227
$ then
$ write output f$extr(0,227,data)
$ data = f$extr(227,999,data)
$ n = n + 1
$ else
$ read/end=done input record
$ data = data + record
$ endif
$ goto loop
$done:
$write sys$output "Created ''n' 227 byte records"
$if l.ne.0
$ then
$ f = 227 - 'l
$ write output data + f$fao("!''f'* ")
$ write sys$output "Added ''l' byte space padded record"
$endif
$close input
$close output
$exit
|