iconv 将 Mainframe EBCDIC 文件转换为 Unix 可读格式将数据写入一行
Posted
技术标签:
【中文标题】iconv 将 Mainframe EBCDIC 文件转换为 Unix 可读格式将数据写入一行【英文标题】:iconv to convert Mainframe EBCDIC file to Unix readable format writes data in one single row 【发布时间】:2021-01-23 00:13:53 【问题描述】:我正在尝试使用以下 iconv 命令将大型机文件转换为 Unix 可读格式。 iconv -f IBM-037 -t ISO8859-1 FileA > FileB
此命令按预期转换数据,但将输出数据写入一行。 有人可以帮助处理这种文件格式转换吗?
【问题讨论】:
您的“大型机文件”是 z/OS 数据集还是 z/Unix 文件?你在大型机上运行 iconv 吗? 【参考方案1】:@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。这是无法改变的。但在你的情况下,这很好。
【讨论】:
谢谢 - 我一直在努力实现简单、可靠的转换,并在提高 PMR 后从 IBM 获得了我的解决方案。 一些 z/OS UNIX 实用程序正式支持读取或写入 MVS 数据集,分别。那些确实有它记录在手册或手册页中的人。它们可以安全地用于生产性事务。其他一些实用程序似乎也支持,但文档没有提及。cat
就是一个例子。【参考方案2】:
我猜你将 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
【讨论】:
【参考方案3】:如前所述,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 文件中没有 CR 或 LF 字符。”不,z/OS (UNIX) 文本文件 确实有行尾字符 (0x0A),但 z/OS (MVS) 数据集没有。挑剔?也许吧,但它有助于澄清你在说什么,尤其是当你在上下文中都有这两种情况时,比如你的例子。无意冒犯,只是一个建议。 也许——我只是习惯于人们一边说 z/OS 或 MVS 文件/数据集一边说 USS 文件。我不记得有人将 USS 环境中的文件称为 z/OS 文件。以上是关于iconv 将 Mainframe EBCDIC 文件转换为 Unix 可读格式将数据写入一行的主要内容,如果未能解决你的问题,请参考以下文章
将 VB EBCDIC 文件转换为 ASCII,其中字帖记录以 01 分隔