Csharp/C#教程:阅读Cobol生成的文件分享


阅读Cobol生成的文件

我目前正在编写ac#application,它将位于两个现有应用程序之间。 我所知道的第二个应用程序是它处理第一个应用程序生成的文件。 第一个应用程序是用Cobol编写的。

步骤:1)Cobol应用程序,将一些文件和副本写入目录。 2)第二个应用程序选择这些文件并处理它们。

我的C#应用​​程序将介于1)和2)之间。 它必须拿起1)生成的文件,读取它,修改它并保存它,以便应用程序2)不知道我甚至在那里。

我有一些问题。

我试过这种方式读取文件,但它仍然不可读:

码:

string ss = @"filename"; using (FileStream fs = new FileStream(ss, FileMode.Open)) { StreamReader sr = new StreamReader(fs); string gg = sr.ReadToEnd(); } 

此外,如果我找到一种方法使其可读(使用某种编码技术),我担心当我再次保存文件时,我可能会改变它的原始格式。

有什么想法吗? 建议?

要阅读COBOL-genned文件,您需要知道:

首先,您需要文件的记录布局 (副本)。 COBOL记录布局如下所示:

 01 PATIENT-TREATMENTS. 05 PATIENT-NAME PIC X(30). 05 PATIENT-SS-NUMBER PIC 9(9). 05 NUMBER-OF-TREATMENTS PIC 99 COMP-3. 05 TREATMENT-HISTORY OCCURS 0 TO 50 TIMES DEPENDING ON NUMBER-OF-TREATMENTS INDEXED BY TREATMENT-POINTER. 10 TREATMENT-DATE. 15 TREATMENT-DAY PIC 99. 15 TREATMENT-MONTH PIC 99. 15 TREATMENT-YEAR PIC 9(4). 10 TREATING-PHYSICIAN PIC X(30). 10 TREATMENT-CODE PIC 99. 

您还需要一份IBM的操作原理 (S / 360,S370,z / OS,对我们的目的并不重要)。 最新版本可从IBM获得

第8章(十进制指令)和第9章(浮点概述和支持指令)是我们的目的。

没有它,你几乎迷失了。

然后,您需要了解COBOL数据类型。 例如:

如果数据源是IBM大型机,则COMP-1和COMP-2可能不会是IEE浮点:它将是IBM的16位超额64浮点格式 。 你需要像S / 370操作原理这样的东西来帮助你理解它。

与COMP-3相关的是十进制分区。 这可能被声明为“PIC S9999V99”(带符号,5位十进制数字,带有隐含的小数点)。 EBCDIC中的十进制数字是hex值0xFO – 0xF9。 ‘解包’(主机机器指令)采用压缩十进制字段并转入字符字段。 过程是:

因此,如果使用默认符号值(hexD)存储,我们的示例值-345.67将被解压缩为0xF0F0F0F3F4F5F6D7(’0003456P’,在EBDIC中)。

[你去吧。 稍后会有一个小测验]

  1. 如果COBOL应用程序位于IBM大型机上,文件是否已从其本机EBCDIC转换为ASCII? 如果没有,你将不得不进行自我映射(提示:它不一定像看起来那么简单,因为这可能是一个选择性过程 – 只转换字符字段(COMP-1,COMP-2,COMP) -3和BINARY被排除在外,因为它们是二进制八位字节的序列。更糟糕的是,由于不同的打印机使用不同的国家实现和不同的打印链,有多种EBCDIC表示forms。

哦……最后一件事。 大型机硬件倾向于喜欢在半字,字或双字边界上对齐的不同事物,因此记录布局可能不直接映射到文件中的八位字节,因为在字段之间可能存在填充八位字节以维持所需的字对齐。

祝好运。

我从您的问题附带的评论中看到,您正在处理“经典”COBOL批处理文件结构:标题记录,详细记录和预告片记录。

如果您负责创建预告片记录,这可能是个坏消息! 典型的“预告片”记录用于识别文件结尾并提供控制信息,例如其前面的记录数量以及“详细”记录的各种校验和和/或总计。 换句话说,您可能需要阅读并汇总整个文件才能创建预告片。 除此之外,文件中的大部分数据都是Packed Decimal,Zoned Decimal或其他COBOLish数字数据类型的可能性,您可能会陷入困境。

您可能想要质疑为什么要将拖车记录添加到这些文件中。 通常,“预告片”由创建“详细”记录的相同程序或应用程序生成。 预告片应该作为validation发送应用程序/程序写入它应该的所有数据。 接收应用程序使用摘要总计,计数等来validation详细记录与前面的详细信息一致。 这应该作为另一个validation,发送应用程序没有消除数据或它没有在途中损坏(不,这不是一个笑话 – 但也许应该是)。 当一个“中间人”创造了预告片时,它会破坏演习的整个目的(无论它开始时有多么有缺陷)。

  • 除非文件来自Mainframe / AS400,否则不太可能使用EBCDIC(cp037 – Coded Page 37是US EBCDIC),任何文本最有可能出现在Ascii中。

  • 该文件可能包含Packed-Decimal(Comp3)和Binary-Integer数据。 大多数Cobols甚至在Intel(小端硬件)上使用Big-Endian(用于Comp整数)。

  • 使用Cobol PIC s9(6)V99 comp时要记住的一件事是存储为二进制整数,x’0001’代表0.01。 因此,除非你有Cobol定义,否则你不能告诉二进制1是1 0.1,0.01等

    上述就是C#学习教程:阅读Cobol生成的文件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

  • 本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

    ctvol管理联系方式QQ:251552304

    本文章地址:https://www.ctvol.com/cdevelopment/1003743.html

    (0)
    上一篇 2021年12月28日
    下一篇 2021年12月28日

    精彩推荐