【问题标题】:Reading a mainframe EBCDIC File [closed]读取大型机 EBCDIC 文件 [关闭]
【发布时间】:2014-09-06 15:23:29
【问题描述】:

我有一个 EBCDIC 编码的大型机文件,我需要将其转换为 ASCII 格式。我可以使用哪些库/工具来做到这一点。我最熟悉Python。

我收到的文件里面有一本cookbook,可以用来解析文件(部分如下)。

类型:“C”、“P”和“B”是什么意思?我猜 C = 字符,B = 字节,P = 压缩数?

1:----------------------------------------------------------------------------------------------------------------------------------:
 :LAYOUT NAME:         B224E           DATE:    02/20/14         PAGE   7 OF  14:
 :                     -------                  --------              ---    ---:
 :COBOL:  PAN-NAME: NONE                 COPYLIB-NAME: RECB224E                 :
 :                  --------------------               --------------------     :
 :BAL  :  PAN-NAME: NONE                 COPYLIB-NAME: NONE                     :
 :------------------------------------------------------------------------------:
 :TYPE OF RECORD:  EXTENDED SORT KEY AREA - SEGMENT "A"  (OPTIONAL)             :
 :------------------------------------------------------------------------------:
 :POSITION  : LENGTH : TYPE :   DESCRIPTION                                     :
 :----------:--------:------:---------------------------------------------------:
 :          :        :      :                                                   :
 :          :        :      :                                                   :
 :          :        :      :                                                   :
 :001 - 001 :    1   :   C  :  SEGMENT IDENTIFIER - "A"                         :
 :          :        :      :                                                   :
 :002 - 003 :    2   :   P  :  SEGMENT LENGTH                                   :
 :          :        :      :                                                   :
 :004 - ??? :   ???  :   C  :  EXTENDED SORT KEY AREA                           :
 :          :        :      :                                                   :

【问题讨论】:

  • 这是一个愚蠢的想法,如果您有压缩十进制和二进制字段,这将不起作用。查看最近标记为ebcdic 的问题以获取更多详细信息。不要这样做。不要被给你文件的人骗了。他们应该为您提供纯文本文件,并且文件传输过程应该进行转换。其他任何事情都应该通过审核。审计员:“所以,你收到一个数据文件,然后在对其进行任何操作之前对其进行更改?”你:“是的,我也从网上找了一些随机代码来做这件事”。审核员移除大红色记号笔,在页面上绘制 A4 大小的X
  • 是的,它会起作用的,作为一个物种,我们已经在许多混合架构上这样做了 30 多年,尤其是对于 IBM 主机和英特尔客户。该文件必须在字段级别进行映射,并为每个字段应用转换。有时这被称为模板。有许多 ETL 产品可以在消费者层面做到这一点。尤其是“数据阶段”。您可以使用 Python 从头开始​​执行此操作,因为文本和数字字段应该可以轻松地从 IBM037 或 IBM500 映射到 ascii。二进制文件通常会设置大小(半字向上)。 P 的按位算术。

标签: python ascii mainframe ebcdic


【解决方案1】:

看看codecs 模块。从standard encodings table 看来,EBCDIC 也被称为cp-500。像下面这样的东西应该可以工作:

import codecs

with open("EBCDIC.txt", "rb") as ebcdic:
    ascii_txt = codecs.decode(ebcdic, "cp500")
    print(ascii_txt)

正如 cmets 中的 mpez0 所述,如果您使用的是 Python 3,则可以将代码压缩为:

with open("EBCDIC.txt", "rt", "cp500") as ebcdic:
    print(ebcdic.read())

手头没有 EBCDIC 文件,我无法对此进行测试,但它应该足以让您开始使用。

【讨论】:

  • 使用 Python3,可以做 open("EBCDIC.txt", "rt", encoding="cp500")。此外,文档中的“cp500”中没有短划线或下划线。
  • @mpez0 哎呀,我的错,我会修复它。
  • 文件不是文本。该示例包含一个打包字段,并且似乎还有其他记录,因为可能引用了二进制数据。这将丢弃该文件。
  • 这是一个非常古老的问题,但为了正确起见,我得到一个TypeError,因为 ebcdic 是一种文件类型,而不是运行第一个代码 sn-p 时的字符串。但是,将 decode 的参数更改为 ebcdic.read() 可以解决此问题。也许它会帮助某人知道。
  • 你猜P 代表packed decimalstruct package 应该有助于逐字节读取它们。 C 是可以使用 EBCDIC 解码为 Unicode 的字符,尽管有许多本地变体。 cp500 可能是一个很好的起点。更多 EBCDIC 编解码器可从 PyPI 上的 ebcdic package 获得。您的文件看起来像可变记录长度 VSAM。您可能会在 IBM 的网站上找到有关此的更多信息,尽管往往会移动和删除页面。
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
相关资源
最近更新 更多