【问题标题】:How to read text file lines after Specific lines using StreamReader如何使用 StreamReader 在特定行之后读取文本文件行
【发布时间】:2014-04-19 22:21:56
【问题描述】:

我有一个文本文件,我正在使用 StreamReader 阅读。现在,根据我的要求,无论我先阅读什么行,我不想再次阅读意味着我不想再次获取该数据。所以我添加了 File.ReadLines(FileToCopy).Count();获取首先读取的行数的代码。现在无论上面的代码行返回什么行,我都想在那之后阅读。 这是我的代码。

        string FileToCopy = "E:\\vikas\\call.txt";

        if (System.IO.File.Exists(FileToCopy) == true)
        {

            lineCount = File.ReadLines(FileToCopy).Count();

            using (StreamReader reader = new StreamReader(FileToCopy))
            {

            }
         }

我需要在这里指定什么条件。请帮助我。

       while ((line = reader.ReadLine()) != null)
        {

            var nextLines = File.ReadLines(FileToCopy).Skip(lineCount);

        if (line != "")
        {
        }

【问题讨论】:

    标签: c# string io text-files streamreader


    【解决方案1】:

    有一种更快的方法来执行此操作,无需您阅读整个文件即可到达您停止的位置。关键是跟踪文件的长度。然后您以FileStream 的形式打开文件,定位到之前的长度(即您之前阅读的结尾处),然后创建StreamReader。所以它看起来像这样:

    long previousLength = 0;
    

    然后,当你想复制新东西时:

    using (var fs = File.OpenRead(FileToCopy))
    {
        // position to just beyond where you read before
        fs.Position = previousLength;
    
        // and update the length for next time
        previousLength = fs.Length;
    
        // now open a StreamReader and read
        using (var sr = new StreamReader(fs))
        {
            while (!sr.EndOfStream)
            {
                var line = sr.ReadLine();
                // do something with the line
            }
        }
    }
    

    如果文件变大,这将为您节省大量时间。例如,如果您上次读取文件时文件大小为千兆字节,那么File.ReadLines(filename).Skip(count) 将花费您 20 秒的时间才能读完,以便您可以读取下一行。我上面描述的方法将花费更少的时间——可能不到一秒。

    【讨论】:

    • 投反对票?习惯上发表评论,解释您认为此答案无用的原因。
    【解决方案2】:

    这个:

    lineCount = File.ReadLines(FileToCopy).Count();
    

    将返回文件中的总行数。它对你没用。你需要存储从文件中读取的行数。然后每次再次读取时,使用Skip方法:

    var nextLines = File.ReadLines("filaPath").Skip(lineCount);
    

    这里不需要StreamReader。例如,如果你是第一次读取文件,比如说10这一行:

    var lines = File.ReadLines(filePath).Take(10);
    lineCount += 10;
    

    第二次Skip 第一行10 阅读更多内容并更新lineCount

    var nextLines = File.ReadLines(filePath).Skip(lineCount).Take(20);
    
    lineCount += 20;
    

    更一般地说,您可以为此编写一个方法,并在您想阅读下一行时调用它:

    public  static string[] ReadFromFile(string filePath, int count, ref int lineCount)
    {
        lineCount += count;
        return File.ReadLines(filePath).Skip(lineCount).Take(count).ToArray();
    }
    
    private static int lineCount = 0;
    private static void Main(string[] args)
    {
       // read first ten line
       string[] lines = ReadFromFile("sample.txt", 10, ref lineCount);
    
       // read next 30 lines
       string[] otherLines = ReadFromFile("sample.txt", 30, ref lineCount)
    }
    

    希望你能明白。

    【讨论】:

    • 先生,我尝试过但无法进入我的状态。请查看我更新后的代码
    • 先生,我必须逐行阅读并且无法输入 int count 因为不知道添加了多少新行
    • 如果您的意思是在文件开头插入新行,那么您将别无选择,只能记住这些行的详细信息,然后跳过一个-当你认出相似之处时,一个接一个。非常复杂,而且不太可能可靠。只有被附加到的文件才能以这种方式易于阅读。
    【解决方案3】:

    只需从您的新流中读取lineCount 行:

    for(int n=0; n<lineCount; n++) 
    {
        reader.ReadLine();
    }
    

    这是最简单的方法,当您实际上必须跳过 N 行(而不是 N 个字节)时。

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 2017-02-12
      • 2021-03-25
      • 2016-10-19
      • 1970-01-01
      • 2019-01-14
      相关资源
      最近更新 更多