3

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

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

A2401028475764B241102847576511001200C...

解析后应如下所示:

输出A.txt

(Field1,Field2,Field3) - heading

A,240,1028475764

输出B.txt

(Field1,Field2,Field3,Field4,Field5) - heading

B,241,1028475765,1100,1200

输出C.txt

C,...//and so on

本质上,它是一个 hex-dump 样式的字节输入,它是连续的,没有任何行终止符或需要解析的数据之间的间隙。如上所示,数据由一个接一个的不同数据类型组成。

这是我的代码片段 - 因为任何字段中都没有逗号,并且不需要使用“”(即 CSV 包装器),我只是使用 TextWriter 来创建 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...

我的问题很简单——如何使用循环来读取整个文件?通常,它超过 1 GB(排除 File.ReadAllBytes 和Best way to read a large file into a byte array in C#?建议的方法) - 我考虑使用 while 循环,但 peekchar 不适合这里。此外,案例 A、B 等具有不同大小的输入 - 换句话说,A 总共可能是 40 个字节,而 B 是 50 个字节。因此,使用固定大小的缓冲区,例如 inputBuf [1000] 或 [50] - 如果它们的大小都相同 - AFAIK 也不能很好地工作。

有什么建议么?我对 C# 比较陌生(2 个月),所以请保持温和。

4

1 回答 1

0

您可以逐字节读取附加到currentBlock字节数组的文件,直到找到下一个块。如果该字节标识了一个新块,则您可以解析currentBlock使用您的case技巧并制作currentBlock= characterJustRead。

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

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

你说“问题是数据不是 100% 洁净的——也就是说,在某些情况下,我需要单独处理我希望识别每个块的字符不在正确位置的可能性。” 但建立一个currentBlock仍然应该工作。代码肯定会有一些复杂性,可能类似于nextBlock,但我在这里猜测,不知道您必须处理哪些不正确的数据。

于 2013-06-26T14:58:04.530 回答