【问题标题】:C# Reading parts of txt fileC#读取部分txt文件
【发布时间】:2019-09-05 06:58:19
【问题描述】:

我有一个 txt 文件,它是从类似这样的软件中获得的。

----------------------------------------------------------------------------
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX
----------------------------------------------------------------------------

XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX

-- YYYYYYYYYYYYYY ----------------------------------------------------------
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX

-- YYYYYYYYY ---------------------------------------------------------------
 (1) AAAAAAAAAAAAAA
 (2) BBBBBBBBBBBBBB
 (3) CCCCCCCCCCCCCC

----------------------------------------------------------------------------
 (1) AAAAAAAAAAAAAA
----------------------------------------------------------------------------
           Model : AAAAAAAAAAAAAA
        Firmware : XXXXXXXXXXXXXX
   Serial Number : 00000000000000
       Disk Size : 999 GB

-- XXXXXXXXXX --------------------------------------------------------------

我只需要从这部分读取数据:

----------------------------------------------------------------------------
 (1) AAAAAAAAAAAAAA
----------------------------------------------------------------------------
           Model : AAAAAAAAAAAAAA
        Firmware : XXXXXXXXXXXXXX
   Serial Number : 00000000000000
       Disk Size : 999 GB

-- XXXXXXXXXX --------------------------------------------------------------

我试过这样的 StreamReader:

StreamReader sw = new StreamReader(txtFile);
while (!sw.EndOfStream)
{
    string line = sw.ReadLine();
    if (line.Contains("(1)"))
    {
        OtherFunction(line);
    }
}
sw.Close();

但这并不好。我不能使用只能从第 20 行到第 23 行读取的函数。我需要对 SteamReader 说,他必须从包含 ------------------ 的行读取到包含 -- XXXXXXXXXX ---- 的行

任何帮助将不胜感激。 谢谢!

【问题讨论】:

  • 您可以使用this 解决方案。不过我猜这个方法也会把txt文件加载到内存中。
  • 为什么对这个问题投反对票?

标签: c# text streamreader


【解决方案1】:

您可以尝试 Linqquery 以获取所需的行,如下所示:

using System.IO;
using System.Linq;

...

var lines = File
  .ReadLines(txtFile)
  .SkipWhile(line => !line.Contains("(1)"))         // Skip all lines before "...(1)..." 
  .SkipWhile(line => !line.Contains("-------------------")) // -/- "----"
  .Skip(1)                                          // Skip "----" itself
  .TakeWhile(line => !line.Contains("XXXXXXXXXX"))  // Take all lines before "...XXXXXX..."
  .ToArray();                                       // Have lines as an array 

【讨论】:

    【解决方案2】:

    我会使用返回字符串数组的 File.ReadAllLines() 而不是 StreamReader。

    然后您可以遍历数组,直到找到所需的结果提取并继续。 例如:

    var lines = File.ReadLines(txtFile);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多