用于读取不同数据类型的循环&从文件中删除非常大的字节数组

本文关键字:非常 删除 数组 字节数 字节 文件 读取 数据类型 循环 用于 | 更新日期: 2023-09-27 18:18:15

我有一个原始字节流存储在一个文件(rawbytes.txt)中,我需要对其进行解析并输出到csv样式的文本文件。

原始字节的输入(当作为字符/long/int等读取时)看起来像这样:

A2401028475764B241102847576511001200C...

解析后应该是:

OutputA.txt

(Field1,Field2,Field3) - heading
A,240,1028475764

OutputB.txt

(Field1,Field2,Field3,Field4,Field5) - heading
B,241,1028475765,1100,1200

OutputC.txt

C,...//and so on

本质上,它是一个十六进制转储风格的字节输入,它是连续的,没有任何需要解析的行终止符或数据之间的空白。如上所示,数据由不同的数据类型一个接一个地组成。

这是我的代码片段-因为在任何字段内都没有逗号,也不需要使用"(即CSV包装器),我只是使用textwwriter来创建CSV风格的文本文件,如下所示:

if (File.Exists(fileName))
        {
        using (BinaryReader reader = new BinaryReader(File.Open(fileName, FileMode.Open)))
            {
                inputCharIdentifier = reader.ReadChar();
                switch (inputCharIdentifier)
                     case 'A':
                        field1 = reader.ReadUInt64();
                        field2 = reader.ReadUInt64();
                        field3 = reader.ReadChars(10);
                        string strtmp = new string(field3);
                        //and so on
                        using (TextWriter writer = File.AppendText("outputA.txt"))
                        {
                            writer.WriteLine(field1 + "," + field2 + "," + strtmp); // +  
                        }
                        case 'B':
                        //code...

我的问题很简单- 我如何使用循环来读取整个文件?一般来说,它超过1gb(这就排除了File。ReadAllBytes和在c#中读取大文件到字节数组的最佳方法中建议的方法-我考虑使用while循环,但peekchar在这里不合适。同样,情况A, B等具有不同大小的输入-换句话说,A可能总共40个字节,而B是50个字节。所以使用固定大小的缓冲区,比如inputBuf[1000],或者[50]——如果它们都是相同的大小——也不会很好地工作。

有什么建议吗?我对c#比较陌生(2个月),所以请温柔。

用于读取不同数据类型的循环&从文件中删除非常大的字节数组

您可以一个字节一个字节地读取文件,并将其附加到currentBlock字节数组中,直到找到下一个块。如果字节标识了一个新的块,那么您可以使用case技巧解析currentBlock,并使currentBlock = characterJustRead。

这种方法可以工作,即使下一个块的id长于1字节——在这种情况下,你只是解析currentBlock[0,currentBlock.Lenght-lenOfCurrentIdInBytes]——换句话说,你读得有点多,但你只解析需要的,并使用剩下的作为下一个currentBlock的基础。

如果您想要更快的速度,您可以以X字节为块读取文件,但应用相同的逻辑。

你说"问题是数据不是100%的犹太-即在某些情况下,我需要单独处理我期望识别每个块的字符不在正确位置的可能性。"但构建currentBlock仍然应该工作。代码肯定会有一些复杂性,也许像nextBlock这样的东西,但我在这里猜测,不知道您必须处理哪些不正确的数据。