我有一个文本文件,其中包含一个固定长度的表,我试图解析。但是,文件的开头是关于何时生成此表的一般信息(IE时间,数据等)。阅读流与2个不同的阅读器
要阅读本文,我试图制作一个FileStream
,然后用StreamReader
读取此文件的第一部分。我从文档的顶部解析出我需要的内容,然后在完成后将流的位置设置为结构化数据的第一行。
然后,我将一个TextFieldParser
附加到流(具有适当的固定长度表设置),然后尝试读取文件。在第一行中,它失败,并在ErrorLine
属性中列出了表的第三行的后半部分。我通过它,它是在第一行阅读,但ErrorLine
财产建议,否则。
调试时,我发现如果我在将TextFieldParser
附加到流中后尝试使用我的StreamReader.ReadLine()
方法,则前两行显示正常。但是,当我读取第三行时,它将返回一行,以第三行的前半部分开头(并在ErrorLine
中的文本所在的位置停止)会附加文档中稍后的某个部分。如果我在附上TextFieldParser
之前尝试此操作,它会读取所有3行。
我有一种感觉,这与我将2个读者绑定到同一个流中有关。我不知道如何用结构化部分和非结构化部分来读取它,而不需要自己标记线条。我可以做到这一点,但我认为我不是第一个想要单独阅读流的一部分的人,以及另一个流的后面部分。
为什么它会跳过这样的情况,以及如何阅读不同格式的文本文件?
例如:对于这个简单的例子定制
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;
你可以发布您的代码?这将有助于识别问题 – VladL 2013-03-01 22:58:12
@VladL好的,我添加了针对该示例的代码。有一点需要注意的是,我将数据添加到“DataTable”并从此函数返回。 – Xantham 2013-03-01 23:09:44