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