我们有许多 EBCDIC 格式的大型机文件,Python 中有没有办法将大型机文件解析或转换为 csv 文件或文本文件?
Posted
技术标签:
【中文标题】我们有许多 EBCDIC 格式的大型机文件,Python 中有没有办法将大型机文件解析或转换为 csv 文件或文本文件?【英文标题】:We have many mainframe files which are in EBCDIC format, is there a way in Python to parse or convert the mainframe file into csv file or text file? 【发布时间】:2019-06-12 18:44:03 【问题描述】:我需要从大型机文件中读取记录并对记录值应用一些过滤器。 所以我正在寻找将大型机文件转换为 csv 或文本或 Excel 工作簿的解决方案,以便我可以轻松地对文件执行操作。
我还需要验证记录数。
【问题讨论】:
this answer 的副本? @PeterT 它不是文本文件,我们如何读取不是 . txt 文件? 这取决于内容:可以是任何内容。可能是 SAS 文件,也可能是其他文件,我们无法为您猜测。最好的,通常也是唯一的方法,是用创建它们的原始软件打开文件,然后导出到更“便携”的文件中。 "它不是文本文件" - EBCDIC 不只是文本数据的表示吗? en.wikipedia.org/wiki/EBCDIC 这种事情经常出现。 Here 是您可能需要考虑的一些事项。 【参考方案1】:谁说过 EBCDIC? OP没有。
如果它是所有文本,那么使用 EBCDIC 到 ASCII 转换的 FTP'ing 是可行的,包括在 Python 中。
如果不是,那么:
需要在 z/OS 上进行提取和转换为 CSV。也许使用 COBOL 程序。然后 CSV 可以通过 FTP 下载或
数据必须经过 FTP 处理 BINARY,然后对其进行解析和翻译。但是,通常情况下,我们需要更多信息。
【讨论】:
“谁说过 EBCDIC?OP 没有。” - 除了标题.... 对。但是所有EBCDIC?还是里面有一些二进制文件?【参考方案2】:我最近正在处理硬拷贝日志,想打破记录。我使用 python 来执行此操作,因为该记录实际上是一个固定位置记录,在记录的固定位置具有不同的数据项。在我的例子中,整个记录都是文本,但人们可以轻松地应用这种技术将各种列转换为适当的类型。
这是一个示例记录。我添加了几行代码来帮助可视化代码中用于访问数据的数据偏移:
1 2 3 4 5 6 7 8 9
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
N 4000000 PROD 19114 06:27:04.07 JOB02679 00000090 $HASP373 PWUB02#C STARTED - INIT 17
注意各个项目的固定列位置以及它们是如何按位置引用的。使用这种技术,您可以处理文件并创建一个 CSV,其中包含您想要在 Excel 中处理的输出。
就我而言,我使用的是 Python 3。
def processBaseMessage(self, message):
self.command = message[1]
self.routing = list(message[2:9])
self.routingCodes = [] # These are routing codes extracted from the system log.
self.sysname = message[10:18]
self.date = message[19:24]
self.time = message[25:36]
self.ident = message[37:45]
self.msgflags = message[46:54]
self.msg = [ message[56:] ]
然后,您可以将其格式化为您需要进一步处理的表格。还有其他处理大型机数据的方法,但根据问题,这种方法应该适合您的需求,但有很多变体。
【讨论】:
以上是关于我们有许多 EBCDIC 格式的大型机文件,Python 中有没有办法将大型机文件解析或转换为 csv 文件或文本文件?的主要内容,如果未能解决你的问题,请参考以下文章
将EBCDIC转换后的文件和pdf文件合并为一个文件并推送到大型机
iconv 将 Mainframe EBCDIC 文件转换为 Unix 可读格式将数据写入一行