我有多个文件来自大型机系统,基本上是EBCDIC数据。现在,其中一些文件包含来自多个模块的数据,附加在一个文件中,例如,假设我有一个文件CISA,它有来自多个子模块的数据。现在所有这些模块的行长度为1000字节,但具有不同的数据结构。因此,要读取这些文件,我需要使用不同的布局,为此,我需要根据在给定位置指定的键值将父文件拆分为多个文件,比如字节范围20-23。 对于第一行,20-23字节范围值可能为0001,对于下一行0002,所以我需要根据字节范围的值将此文件拆分为多个文件。
在我目前使用C#的实现中,我所做的是使用字节流读取数据,然后一次读取一行。我使用了一个包含两列的数据表,第一列存储了基于字节范围(20-23)值生成的文件名,第二列存储了我刚刚读取的字节流。
我一直这样做,所以一旦读完整个文件,我就有了一个数据表,它给出了这些文件的文件名和字节流列表。我遍历数据表并根据存储在列名中的文件名写入每一行。
这个解决方案工作正常,但由于写入数据表时I / O很高,性能确实很慢。那么有一个选项,我可以跳过为每一行写入数据,而是一次性保存整个分区。
答案 0 :(得分:2)
首先,我完全忘记了DataTable
- 这似乎是个糟糕的主意。文件有多大?如果它们很小:只需加载所有数据(File.ReadAllBytes
)并为每个数据使用ArraySegment<byte>
(可能是List<ArraySegment<byte>>
) - 或者如果您使用预览即可位:这对Span<byte>
很有用(类似于ArraySegment<byte>
,但更多......更多)。
如果文件很大,我在这里查看MemoryMappedFile
;看起来很合适。