我正在尝试使用下面的 iconv 命令将大型机文件转换为 Unix 可读格式。
iconv -f IBM-037 -t ISO8859-1 文件A > 文件B
此命令按预期转换数据,但将输出数据写入一行。 有人可以帮助如何处理此文件格式转换吗?
@Steve Ives,您可以一步完成此操作,消除中间文件和一些 I/O。
在 z/OS UNIX 中,
cp
实用程序可以读写 (unix) 文件以及 (MVS) 数据集。考虑到这一点,您的工作可以完成如下:
//CONVERT EXEC PGM=BPXBATCH,REGION=8M
//STDERR DD SYSOUT=*
//STDOUT DD SYSOUT=*
//STEPLIB DD DISP=SHR,DSN=SYS1.CEE.SCEERUN
//*
//STDPARM DD *
sh /bin/cp -T -O c=iso8859-1
"//'P.OPS.CA7GRAPH.MCAWKLY.REPORT'"
/u/jocs065/ihsconfig/ihs/jocs065/cgi-bin/phpNoSecure/MCAWKLY.txt
/*
注意,
cp
默默地假定源代码页是 IBM-1047。这是无法改变的。但就你而言这很好。
我猜你将binary中的数据从z/OS传输到UNIX,然后在UNIX端使用
iconv
。 z/OS 数据集记录上没有行结束字符,因此 iconv 数据中没有任何内容可以转换为行结束字符。
您需要以ASCII进行传输。 FTP 将负责翻译, 和 将插入行结束字符。
如果 z/OS 上 FTP 服务器上的默认设置不是您需要的,您可以设置影响翻译中使用的代码页:
quote site sbdataconn=(*host-code-page*,*network-(unix)-code-page*)
默认行结束符是0x0d0a。您可以通过
更改此设置quote site sbsendeol=NL
CR
CRLF (default)
NONE
如前所述,z/OS 文件中没有 CR 或 LF 字符。
我有一个应用程序,需要由 PHP 程序处理 z/OS 文件,因此我使用 USS
OCOPY
命令批量将文件从 z/OS 复制到 USS:
//COPYMCA EXEC PGM=IKJEFT01
//*
//MVS DD DISP=SHR,DSN=P.OPS.CA7GRAPH.MCAWKLY.REPORT MCA Data
//*
//HFS DD PATH='/u/jocs065/ihsconfig/ihs/jocs065/cgi-bin/phpNoSecure/
// MCAWKLY_EBC.txt',
// PATHDISP=(KEEP,DELETE),
// PATHOPTS=(OWRONLY,OCREAT), Add OEXCL to fail if exists
// PATHMODE=(SIRUSR,SIWUSR,SIROTH)
//*
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
OCOPY INDD(MVS) OUTDD(HFS) TEXT CONVERT((BPXFX000))
然后第二步运行
iconv
进行代码页转换:
//* Convert USS file to correct character set.
//CONVERT EXEC PGM=BPXBATCH,REGION=8M
//STDERR DD SYSOUT=*
//STDOUT DD SYSOUT=*
//STEPLIB DD DISP=SHR,DSN=SYS1.CEE.SCEERUN
//*
//STDPARM DD *
sh /bin/iconv -f IBM-1047 -t ISO8859-1
/u/jocs065/ihsconfig/ihs/jocs065/cgi-bin/phpNoSecure/MCAWKLY_EBC.txt >
/u/jocs065/ihsconfig/ihs/jocs065/cgi-bin/phpNoSecure/MCAWKLY.txt
//*
我使用以下技术在 z/OS 数据集上执行 iconv:
cat "//'MY.MVS.DATA.SET'" | iconv -f IBM-273 -t UTF-8 > ./my.unix.file