读取结构中的Txt文件-如何在C#.net中读取结构中Cobol的出现子句

问题描述 投票:-4回答:2

我正在读取cobol程序成功读取的文本文件。我正在使用Struct在c#.net中编写替换代码。这是我正在使用的参考。 https://www.codeproject.com/Articles/7357/How-to-copy-a-String-into-a-struct-using-C

这里是cobol

  05  NUM           PIC X(6)
  05  FLAG          PIC XX
  05  IP            PIC X(12)

这里是C#.net

    public struct ORDER
    {

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 6)] public string NUM;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)] public string FLAG;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)] public string CUSIP;

    }

我能够正确地读取变量,直到从文本文件第一行的开头开始的x位置。

我的输出也匹配;但是,这块Cobol程序中有OCCUR子句,我正在尝试弄清楚;我如何将其添加到我上面共享的ORDER结构中。

  05  AN-AREA.
      10  COST        OCCURS 5 TIMES.
          15 TYPE     PIC XX.
          15 ISO      PIC XXX.
          15 CODE     PIC X(6).
          15 IND-X
                      PIC XX.
          15 IND
                      REDEFINES 
                      IND-X
                      PIC 99.
          15 AMT      PIC X(20).
c# cobol
2个回答
0
投票

正如其他人提到的那样,OCCURS是一个数组。所以

        05 my-array occurs 3
           10 field-1         pic x.
           10 field-2         pic xx.

存储为

      byte position       Field

           1              Field-1 (1)
           2              Field-2 (1)
           4              Field-1 (2)
           5              Field-2 (2)
           7              Field-1 (3)
           8              Field-2 (3)

您可以看一下RecordEditor。它可以导入Cobol Copybooks并显示文件使用导入的Cobol字帖。在“记录视图”中,您将得到类似:

enter image description here


0
投票

我正在阅读文本文件,我必须假定其记录由CR + LF(或LF)分隔。我创建了一个包含三个记录的测试数据文件,并使用StreamReader处理该文件。

重要:创建文件的程序可能会使用截尾的空格。在这种情况下,有必要在记录前附加空格以达到185个字符。

我使用Class而不是struct,因为似乎没有什么需要unmanaged类型。我用Substring分解了记录。

由于主要关注的是如何实现OCCURS子句,所以我展示了如何使用嵌套的Class数组来做到这一点。

简单来说,我的目标是展示may的完成方式。以此为出发点,其他人可能会建议如何进行[[应]]。接受他们的]建议。


程序:

using System; using System.IO; namespace ConsoleApp2 { class Program { static void Main(string[] args) { using (StreamReader sr = new StreamReader(File.Open(@"z:\data.txt", FileMode.Open))) { string s; while ((s = sr.ReadLine()) != null) { if (s.Length != 185) { Console.WriteLine("Wrong length record"); } else { Order c = new Order(); c.NUM = s.Substring(0, 6); c.FLAG = s.Substring(6, 2); c.IP = s.Substring(8, 12); for (int i = 0, idx = 20; i < 5; i++, idx += 33) { c.AN_AREA[i] = new Order.COST(); c.AN_AREA[i].TYPE = s.Substring(idx, 2); c.AN_AREA[i].ISO = s.Substring(idx + 2, 3); c.AN_AREA[i].CODE = s.Substring(idx + 5, 6); c.AN_AREA[i].IND_X = s.Substring(idx + 11, 2); c.AN_AREA[i].AMT = s.Substring(idx + 13, 20); } Console.WriteLine(c.NUM); Console.WriteLine(c.FLAG); Console.WriteLine(c.IP); for (int i = 0; i < 5; i++) { Console.WriteLine(c.AN_AREA[i].TYPE); Console.WriteLine(c.AN_AREA[i].ISO); Console.WriteLine(c.AN_AREA[i].CODE); Console.WriteLine(c.AN_AREA[i].IND_X); Console.WriteLine(c.AN_AREA[i].AMT); } } Console.WriteLine("--------------------"); } } Console.ReadLine(); } } public class Order { public string NUM; //05 NUM PIC X(6) public string FLAG; //05 FLAG PIC XX public string IP; //05 IP PIC X(12) //05 AN-AREA. public COST[] AN_AREA = new COST[5]; //10 COST OCCURS 5 TIMES. public class COST { public string TYPE; //15 TYPE PIC XX. public string ISO; //15 ISO PIC XXX. public string CODE; //15 CODE PIC X(6). public string IND_X; //15 IND-X // PIC XX. //15 IND // REDEFINES // IND-X // PIC 99. public string AMT; //15 AMT PIC X(20). } } }

使用的数据:

AAAAAABBCCCCCCCCCCCCDDEEEFFFFFFGGHHHHHHHHHHHHHHHHHHHHIIJJJKKKKKKLLMMMMMMMMMMMMMMMMMMMMNNOOOPPPPPPQQRRRRRRRRRRRRRRRRRRRRSSTTTUUUUUUVVWWWWWWWWWWWWWWWWWWWWXXYYYZZZZZZaabbbbbbbbbbbbbbbbbbbb aaaaaabbccccccccccccddeeeffffffgghhhhhhhhhhhhhhhhhhhhiijjjkkkkkkllmmmmmmmmmmmmmmmmmmmmnnoooppppppqqrrrrrrrrrrrrrrrrrrrrsstttuuuuuuvvwwwwwwwwwwwwwwwwwwwwxxyyyzzzzzzAABBBBBBBBBBBBBBBBBBBB 123

输出:

AAAAAA BB CCCCCCCCCCCC DD EEE FFFFFF GG HHHHHHHHHHHHHHHHHHHH II JJJ KKKKKK LL MMMMMMMMMMMMMMMMMMMM NN OOO PPPPPP QQ RRRRRRRRRRRRRRRRRRRR SS TTT UUUUUU VV WWWWWWWWWWWWWWWWWWWW XX YYY ZZZZZZ aa bbbbbbbbbbbbbbbbbbbb -------------------- aaaaaa bb cccccccccccc dd eee ffffff gg hhhhhhhhhhhhhhhhhhhh ii jjj kkkkkk ll mmmmmmmmmmmmmmmmmmmm nn ooo pppppp qq rrrrrrrrrrrrrrrrrrrr ss ttt uuuuuu vv wwwwwwwwwwwwwwwwwwww xx yyy zzzzzz AA BBBBBBBBBBBBBBBBBBBB -------------------- Wrong length record --------------------

© www.soinside.com 2019 - 2024. All rights reserved.