在FileStream中移动位置(C#)

时间:2017-05-24 14:04:00

标签: c# filestream

我有一个像这样的txt文件

#header1
#header2
#header3
....
#headerN
ID Value Pvalue
a  0.1  0.002
b  0.2  0.002
...

我的代码会尝试解析

FileStream fs = new FileStream(file, FileMode.Open, FileMode.Read);
......
Table t = Table.Load(fs);

我想要的是在#34; ID"之前使Stream的起始位置,所以我可以将流提供给代码并创建一个新表。但我不确定这样做的正确方法是什么。 提前致谢

2 个答案:

答案 0 :(得分:0)

理想情况下,您应该将Table.Load转换为IEnumerable<string>或至少StreamReader,而不是原始Stream

如果这不是一个选项,您可以将整个文件读入内存,跳过其标题,并将结果写入MemoryStream

MemoryStream stream = new MemoryStream();
using (var writer = new StreamWriter(stream, Encoding.UTF8);
    foreach (var line in File.ReadLines(fileName).SkipWhile(s => s.StartsWith("#"))) {
        writer.WriteLine(line);
    }
}
stream.Position = 0;
Table t = Table.Load(stream);

答案 1 :(得分:-1)

试试此代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication57
{
    class Program
    {
        const string file = "";
        static void Main(string[] args)
        {
            FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
            StreamReader reader = new StreamReader(fs);
            string inputline = "";
            State state = State.FIND_HEADER;
            while((inputline = reader.ReadLine()) != null)
            {
                switch (state)
                {
                    case State.FIND_HEADER:
                        if (inputline.StartsWith("#header"))
                        {
                            state = State.READ_TABLE;
                        }
                        break;
                    case State.READ_TABLE:
                        Table t = Table.Load(fs);
                        break;
                }
            }
        }
        enum State
        {
            FIND_HEADER,
            READ_TABLE
        }

    }
}