Цикл чтения различных типов данных и размеров из очень большого байтового массива из файла

У меня есть сырой поток байтов, хранящийся в файле (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), я просто использую 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 ГБ (что исключает File.ReadAllBytes и методы, предложенные в лучшем случае для чтения большого файла в байтовый массив в C#?) - я рассмотрел использование цикла while, но peekchar здесь не подходит. Кроме того, регистры A, B и т. Д. Имеют входные данные различного размера - другими словами, A может быть общим объемом 40 байт, а B - 50 байтов. Так что использование буфера фиксированного размера, скажем, inputBuf[1000] или [50], например - если бы они были одинакового размера - тоже не сработало бы, AFAIK.

Какие-либо предложения? Я относительно новичок в C# (2 месяца), поэтому, пожалуйста, будьте осторожны.

1 ответ

Вы можете прочитать файл побайтно, который вы добавляете к currentBlock байтовый массив, пока вы не найдете следующий блок. Если байт идентифицирует новый блок, вы можете проанализировать currentBlock используя тебя case обмануть и сделать currentBlock = characterJustRead.

Этот подход работает, даже если идентификатор следующего блока длиннее 1 байта - в этом случае вы просто анализируете currentBlock[0,currentBlock.Lenght-lenOfCurrentIdInBytes] - другими словами, вы читаете слишком много, но затем разбираете только то, что нужно, и используете то, что осталось в качестве основы для следующего currentBlock,

Если вам нужна большая скорость, вы можете прочитать файл кусками по X байт, но примените ту же логику.

Вы сказали: "Проблема в том, что данные не на 100% кошерны - то есть существуют ситуации, когда мне нужно отдельно разобраться с возможностью того, что символ, которого я ожидаю идентифицировать каждый блок, находится не в нужном месте". но строит currentBlock все еще должно работать. Код наверняка будет иметь некоторые сложности, может быть что-то вроде nextBlockНо я догадываюсь здесь, не зная, с какими неверными данными вам приходится иметь дело.

Другие вопросы по тегам