gpt4 book ai didi

c# - 具有 2 个不同读者的阅读流

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:27 27 4
gpt4 key购买 nike

我有一个文本文件,其中包含我要解析的固定长度表。但是,文件的开头是有关何时生成此表的一般信息(IE 时间、数据等)。

为了阅读这个文件,我尝试创建一个 FileStream,然后使用 StreamReader 读取该文件的第一部分。我从文档的顶部解析出我需要的内容,然后在完成后将流的位置设置为结构化数据的第一行。

然后我将 TextFieldParser 附加到流(对固定长度表进行适当设置),然后尝试读取文件。在第一行,它失败了,在 ErrorLine 属性中,它列出了表格第三行的后半部分。我逐步浏览了它,它位于第一行以供阅读,但 ErrorLine 属性表明情况并非如此。

调试时,我发现如果在将 TextFieldParser 附加到流后尝试使用 StreamReader.ReadLine() 方法,前 2 行会显示美好的。然而,当我读取第三行时,它返回一行,它从第三行的前半部分开始(并在 ErrorLine 中的文本所在的位置停止)追加一些后面的部分文档。如果我在附加 TextFieldParser 之前尝试这样做,它会读取所有 3 行。

我觉得这与我将 2 个读者绑定(bind)到同一个流有关。我不确定如何用结构化部分和非结构化部分来阅读这篇文章,而不仅仅是自己标记这些行。我可以这样做,但我想我不是第一个想要以一种方式读取流的一部分,而以另一种方式读取流的后续部分的人。

为什么会这样跳,如何读取不同格式的文本文件?

例子:

Date: 3/1/2013
Time: 3:00 PM
Sensor: Awesome Thing

Seconds X Y Value
0 5.1 2.8 55
30 4.9 2.5 33
60 5.0 5.3 44

为这个简化示例量身定制的代码:

Boolean setupInfo = true;
DataTable result = new DataTable();
String[] fields;
Double[] dFields;

FileStream stream = File.Open(filePath,FileMode.Open);

StreamReader reader = new StreamReader(stream);

String tempLine;

for(int j = 1; j <= 7; j++)
{
result.Columns.Add(("Column" + j));
}

//Parse the unstructured part
while(setupInfo)
{
tempLine = reader.ReadLine();
if( tempLine.StartsWith("Date: "))
{
result.Rows.Add(tempLine);
}
else if (tempLine.StartsWith("Time: "))
{
result.Rows.Add(tempLine);
}
else if (tempLine.StartsWith("Seconds")
{
//break out of this loop because the
//next line to be read is the unstructured part
setupInfo = false;
}
}

//Parse the structured part
TextFieldParser parser = new TextFieldParser(stream);
parser.TextFieldType = FieldType.FixedWidth;
parser.HasFieldsEnclosedInQuotes = false;
parser.SetFieldWidths(10, 10, 10, 10);

while (!parser.EndOfData)
{
if (reader.Peek() == '*')
{
break;
}
else
{
fields = parser.ReadFields();

if (parseStrings(fields, out dFields))
{
result.Rows.Add(dFields);
}
}
}
return result;

最佳答案

它跳过的原因是 StreamReader 正在从 FileStream 中读取数据 block ,而不是逐个字符地读取。例如,StreamReader 可能会从 FileStream 中读取 4 KB,然后根据需要解析出响应 ReadLine() 调用的行。因此,当您将 TextFieldParser 附加到 FileStream 时,它将从当前文件位置读取 - 这是 StreamReader 离开它的位置。

解决方案应该非常简单:只需将 TextFieldParser 连接到 StreamReader:

TextFieldParser parser = new TextFieldParser(reader);

参见 TextFieldParser(TextReader reader)

关于c# - 具有 2 个不同读者的阅读流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com