我有一个存储在文件 (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 个月),所以请保持温和。