我正在读取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).
正如其他人提到的那样,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字帖。在“记录视图”中,您将得到类似:
我正在阅读文本文件,我必须假定其记录由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 --------------------