【问题标题】:Move position in FileStream (C#)在 FileStream (C#) 中移动位置
【发布时间】:2017-05-24 22:38:16
【问题描述】:

我有一个这样的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);

我想要的是在“ID”之前制作流的起始位置,这样我就可以将流提供给代码并制作一个新表。但我不确定正确的方法是什么。 提前致谢

【问题讨论】:

  • 标题大小是否固定?如果它是固定大小的,你可以设置流的位置,例如s.Position = 20;
  • @SvenB:标题大小灵活
  • 保存位置,使用StreamReader.ReadLine检查是否还有其他头部,如果有则循环,如果没有,将位置设置回来,然后Table.Load()

标签: c# filestream


【解决方案1】:

理想情况下,您应该将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);

【讨论】:

    【解决方案2】:

    试试这个代码

    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
            }
    
        }
    }
    

    【讨论】:

    • 没有。不需要。用户想在 ID 行上开始阅读。因此代码将在“#header”之后读取行并获取下一行。
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 2011-01-12
    • 1970-01-01
    • 2021-10-08
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多