C# “拆分”;“固定宽度”;基于字节范围值的文件

C# “拆分”;“固定宽度”;基于字节范围值的文件,c#,file,datatable,ebcdic,C#,File,Datatable,Ebcdic,我有多个来自大型机系统的文件,基本上是EBCDIC数据。现在,其中一些文件包含来自多个模块的数据,附加在一个文件中,例如,假设我有一个文件CISA,其中包含来自多个子模块的数据。现在所有这些模块的行长度都是1000字节,但数据结构不同。因此,要读取这些文件,我需要使用不同的布局,并根据在给定位置指定的键值(比如字节范围20-23)将父文件拆分为多个文件。 对于第一行,20-23字节范围的值可能是0001,对于下一行,可能是0002,所以我需要根据字节范围的值将此文件拆分为多个文件 在我当前使用C

我有多个来自大型机系统的文件,基本上是EBCDIC数据。现在,其中一些文件包含来自多个模块的数据,附加在一个文件中,例如,假设我有一个文件CISA,其中包含来自多个子模块的数据。现在所有这些模块的行长度都是1000字节,但数据结构不同。因此,要读取这些文件,我需要使用不同的布局,并根据在给定位置指定的键值(比如字节范围20-23)将父文件拆分为多个文件。 对于第一行,20-23字节范围的值可能是0001,对于下一行,可能是0002,所以我需要根据字节范围的值将此文件拆分为多个文件

在我当前使用C#的实现中,我所做的是使用字节流读取数据,然后一次读取一行。我使用了一个有两列的数据表,第一列存储文件名,根据字节范围(20-23)值生成,第二列存储我刚才读取的字节流

我一直这样做,一旦整个文件被读取,我就有了一个数据表,它给了我一个文件名列表和这些文件的字节流。我循环遍历数据表,并根据列名中存储的文件名写入每一行


此解决方案工作正常,但由于写入数据表时的高I/O,因此性能非常缓慢。因此,有没有一个选项可以让我跳过为每一行写入数据,而是一次保存整个分区。

首先,我完全忘记了这里的
DataTable
——这似乎是个糟糕的主意。档案有多大?如果它们很小:只需加载所有数据(
File.ReadAllBytes
),并对每个数据使用
ArraySegment
)-或者如果您可以使用预览位:这将是
Span
(类似于
ArraySegment
,但更多…更多)


如果文件很大,我会在这里查看
MemoryMappedFile
;似乎非常适合。

谢谢Marc,文件通常大于500 MBs,最大约为2 GBs。我一定会试试你关于记忆档案的建议。将很快公布结果!