本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 Python 在 AWS 上将 EBCDIC 数据转换并解压为 ASCII
由 Luis Gustavo Dantas (AWS) 编写
代码存储库:大型机数据实用程序 | 环境:PoC 或试点 | 来源:大型机 EBCDIC 数据 |
目标: 分布式或云端现代化 ASCII 数据 | R 类型:更换平台 | 工作负载:IBM |
技术:大型机;数据库;存储和备份;现代化 | Amazon Web Services:Amazon EBS、Amazon EC2 |
Summary
由于大型机通常托管关键业务数据,因此在将数据迁移置 Amazon Web Services (AWS) 云或其他美国信息交换标准规范 (ASCII) 环境时,实现数据现代化很重要。在大型机上,数据通常以扩展二进制编码十进制交换码 (EBCDIC) 格式编码。导出数据库、Virtual Storage Access Method (VSAM) 或平面文件通常会生成打包的二进制 EBCDIC 文件,这些文件迁移比较复杂。最常用的数据库迁移解决方案是变更数据捕获 (CDC),在大多数情况下,其会自动转换数据编码。但是,CDC 机制可能不适用于此数据库、VSAM 或平面文件。对于此文件,需要另一种方法来实现数据现代化。
此模式介绍了如何通过将 EBCDIC 数据转换为 ASCII 格式来实现其现代化。转换后,您可将数据加载至分布式数据库中,也可以让云中的应用程序直接处理数据。该模式使用mainframe-data-utilities GitHub 存储库中的转换脚本和示例文件。
先决条件和限制
先决条件
限制
产品版本
架构
源技术堆栈
目标技术堆栈
虚拟私有云(VPC)中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例
Amazon Elastic Block Store (Amazon EBS)
Python 及其必需的软件包、 JavaScript 对象表示法 (JSON)、系统和日期时间
ASCII 平面文件可供现代应用程序读取或加载至关系数据库表中
目标架构
架构图显示了在 EC2 实例上将 EBCDIC 文件转换为 ASCII 文件的过程:
使用 parse_copybook_to_json.py 脚本,您可将 COBOL 副本转换为 JSON 文件。
使用 JSON 文件和 extract_ebcdic_to_ascii.py 脚本,您可将 EBCDIC 数据转换为 ASCII 文件。
自动化和扩缩
在首次手动文件转换所需资源到位后,您可自动进行文件转换。此示例不包括自动化说明。有多种方法可自动转换。下文概述了一种可能使用的方法:
Amazon Web Services
其他工具
代码存储库
此模式的代码可在mainframe-data-utilities GitHub 存储库中找到。
操作说明
任务 | 描述 | 所需技能 |
---|
启动一个 EC2 实例。 | EC2 实例必须具有出站互联网访问权限。这允许实例访问上可用的 Python 源代码 GitHub。创建实例: | 常规 AWS |
安装 Git。 | 使用 Secure Shell (SSH) 客户端连接到刚启动的 EC2 实例。有关更多信息,请参阅连接到您的 Linux 实例。 在 Amazon EC2 控制台,运行以下命令。这会将 Git 安装至 EC2 实例。 sudo yum install git
运行以下命令并确认 Git 已成功安装。 git --version
| 常规 AWS、Linux |
安装 Python。 | 在 Amazon EC2 控制台,运行以下命令。这将在 EC2 实例上安装 Python。 sudo yum install python3
在 Amazon EC2 控制台,运行以下命令。这将在 EC2 实例上安装 Pip3。 sudo yum install python3-pip
在 Amazon EC2 控制台,运行以下命令。这将在 EC2 实例上安装适用于 Python 的 Amazon SDK (Boto3)。 sudo pip3 install boto3
在 Amazon EC2 控制台,运行以下命令,其中 <us-east-1> 是您的 AWS 区域 代码。有关区域代码的完整列表,请参阅 Amazon EC2 用户指南中的可用区域。 export AWS_DEFAULT_REGION=<us-east-1>
| 常规 AWS、Linux |
克隆 GitHub 存储库。 | 在 Amazon EC2 控制台,运行以下命令。这将从中克隆mainframe-data-utilities存储库 GitHub 并打开默认的副本位置,即home 文件夹。 git clone https://github.com/aws-samples/mainframe-data-utilities.git
在 home 文件夹,确认该 mainframe-data-utilities 文件夹存在。
| 通用 AWS, GitHub |
任务 | 描述 | 所需技能 |
---|
将 COBOL 副本解析至 JSON 布局文件。 | 在 mainframe-data-utilities 文件夹中,运行 parse_copybook_to_json.py 脚本。此自动化模块从 COBOL 副本读取文件布局并创建 JSON 文件。JSON 文件包含解释和提取源文件中数据所需信息。这将通过 COBOL 副本创建 JSON 元数据。 以下命令将 COBOL 副本转换为 JSON 文件。 python3 parse_copybook_to_json.py \
-copybook LegacyReference/COBPACK2.cpy \
-output sample-data/cobpack2-list.json \
-dict sample-data/cobpack2-dict.json \
-ebcdic sample-data/COBPACK.OUTFILE.txt \
-ascii sample-data/COBPACK.ASCII.txt \
-print 10000
该脚本打印所接收到的参数。 -----------------------------------------------------------------------
Copybook file...............| LegacyReference/COBPACK2.cpy
Parsed copybook (JSON List).| sample-data/cobpack2-list.json
JSON Dict (documentation)...| sample-data/cobpack2-dict.json
ASCII file..................| sample-data/COBPACK.ASCII.txt
EBCDIC file.................| sample-data/COBPACK.OUTFILE.txt
Print each..................| 10000
-----------------------------------------------------------------------
有关参数的更多信息,请参阅 GitHub 存储库中的 README 文件。 | 常规 AWS、Linux |
检查 JSON 布局文件。 | 导航到 parse_copybook_to_json.py 脚本中定义的输出路径。 检查 sample-data/cobpack2-list.json 文件的创建时间,确认您选择了相应的 JSON 布局文件。 检查 JSON 文件并确认其内容是否与以下内容相似。
"input": "extract-ebcdic-to-ascii/COBPACK.OUTFILE.txt",
"output": "extract-ebcdic-to-ascii/COBPACK.ASCII.txt",
"max": 0,
"skip": 0,
"print": 10000,
"lrecl": 150,
"rem-low-values": true,
"separator": "|",
"transf": [
{
"type": "ch",
"bytes": 19,
"name": "OUTFILE-TEXT"
}
JSON 布局文件最重要属性是: input — 包含要转换的 EBCDIC 文件的路径
output — 定义生成 ASCII 文件的路径
lrecl — 指定逻辑记录长度的大小(以字节为单位)
transf — 列出所有字段及其大小(以字节为单位)
有关 JSON 布局文件的更多信息,请参阅 GitHub 存储库中的自述文件。 | 常规 AWS、JSON |
创建 ASCII 文件。 | 运行 extract_ebcdic_to_ascii.py 脚本,该脚本包含在克隆的 GitHub 存储库中。此脚本读取 EBCDIC 文件,并写入转换后且可读的 ASCII 文件。 python3 extract_ebcdic_to_ascii.py -local-json sample-data/cobpack2-list.json
当脚本处理 EBCDIC 数据,它会为每批 10,000 条记录打印一条消息。请参阅以下示例。 ------------------------------------------------------------------
2023-05-15 21:21:46.322253 | Local Json file | -local-json | sample-data/cobpack2-list.json
2023-05-15 21:21:47.034556 | Records processed | 10000
2023-05-15 21:21:47.736434 | Records processed | 20000
2023-05-15 21:21:48.441696 | Records processed | 30000
2023-05-15 21:21:49.173781 | Records processed | 40000
2023-05-15 21:21:49.874779 | Records processed | 50000
2023-05-15 21:21:50.705873 | Records processed | 60000
2023-05-15 21:21:51.609335 | Records processed | 70000
2023-05-15 21:21:52.292989 | Records processed | 80000
2023-05-15 21:21:52.938366 | Records processed | 89280
2023-05-15 21:21:52.938448 Seconds 6.616232
有关如何更改打印频率的信息,请参阅 GitHub 存储库中的 README 文件。 | 常规 AWS |
检查 ASCII 文件。 | 检查 extract-ebcdic-to-ascii/cobpack.ascii.txt 文件的创建时间,以验证该文件是否是最近创建的。 在 Amazon EC2 控制台中,输入以下命令。这将会打开 ASCII 文件的第一条记录。 head sample-data/COBPACK.ASCII.txt -n 1| xxd
检查第一条记录内容。由于 EBCDIC 文件通常是二进制文件,因此它们并没有回车符和换行符 (CRLF) 特殊字符。extract_ebcdic_to_ascii.py 脚本添加了竖线字符作为列分隔符,该分隔符在脚本参数中定义。
如果您使用了提供的示例 EBCDIC 文件,以下是 ASCII 文件中的第一条记录。 00000000: 2d30 3030 3030 3030 3030 3130 3030 3030 -000000000100000
00000010: 3030 307c 3030 3030 3030 3030 3031 3030 000|000000000100
00000020: 3030 3030 3030 7c2d 3030 3030 3030 3030 000000|-00000000
00000030: 3031 3030 3030 3030 3030 7c30 7c30 7c31 0100000000|0|0|1
00000040: 3030 3030 3030 3030 7c2d 3130 3030 3030 00000000|-100000
00000050: 3030 307c 3130 3030 3030 3030 307c 2d31 000|100000000|-1
00000060: 3030 3030 3030 3030 7c30 3030 3030 7c30 00000000|00000|0
00000070: 3030 3030 7c31 3030 3030 3030 3030 7c2d 0000|100000000|-
00000080: 3130 3030 3030 3030 307c 3030 3030 3030 100000000|000000
00000090: 3030 3030 3130 3030 3030 3030 307c 2d30 0000100000000|-0
000000a0: 3030 3030 3030 3030 3031 3030 3030 3030 0000000001000000
000000b0: 3030 7c41 7c41 7c0a 00|A|A|.
| 常规 AWS、Linux |
评估 EBCDIC 文件。 | 在 Amazon EC2 控制台中,输入以下命令。这将会打开 EBCDIC 文件的第一条记录。 head sample-data/COBPACK.OUTFILE.txt -c 150 | xxd
如果您使用 EBCDIC 示例文件,则结果如下所示。 00000000: 60f0 f0f0 f0f0 f0f0 f0f0 f1f0 f0f0 f0f0 `...............
00000010: f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f1f0 f0f0 ................
00000020: f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f0f0 f1f0 ................
00000030: f0f0 f0f0 f0f0 d000 0000 0005 f5e1 00fa ................
00000040: 0a1f 0000 0000 0005 f5e1 00ff ffff fffa ................
00000050: 0a1f 0000 000f 0000 0c10 0000 000f 1000 ................
00000060: 0000 0d00 0000 0000 1000 0000 0f00 0000 ................
00000070: 0000 1000 0000 0dc1 c100 0000 0000 0000 ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000090: 0000 0000 0000 ......
要评估源文件和目标文件之间的等效性,则需要全面了解 EBCDIC。例如,示例 EBCDIC 文件的第一个字符是连字符 (- )。在 EBCDIC 文件的十六进制表示法中,此字符由 60 表示,在 ASCII 文件的十六进制表示法中,该字符由 2D 表示。有关 EBCDIC 到 ASCII 的转换表,请参阅 IBM 网站上的 EBCDIC 到 ASCII。 | 常规 AWS、Linux、EBCDIC |
相关资源
参考
教程