【问题标题】:StreamReader C# - read only a specific lineStreamReader C# - 只读取特定的行
【发布时间】:2013-01-28 16:48:58
【问题描述】:

我正在尝试从 webResposne 仅记录第 3 行(如果无法仅记录一行,则为第 1 到 3 行)。

这是我现在使用的代码的 sn-p。

StreamReader read = new StreamReader(myHttpWebResponse.GetResponseStream(), System.Text.Encoding.UTF8);
        String result = read.ReadToEnd();
        Log("Access", Server.HtmlEncode(result), "Success");

我得到以下输出

<html>
<head>
    <title>Access is Granted.</title>
    <style>
     body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} 
     p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px}
     b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}
     H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red }
     H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon }
...

等等。

我只想记录“(title>Access is Granted.(/title>”而不打印任何其他内容(或该行之后的任何内容)。

我该怎么做呢?

谢谢

【问题讨论】:

  • 您是否尝试过为您的任务编写正则表达式?如果是这样,你有问题吗?
  • 假设这个问题是“StreamReader.ReadLine 方法的名称是什么,如果可以调用它 3 次忽略结果前 2 次” - 可能重复 How to skip first line while reading csv using streamreader -
  • 您确定只需要第 3 行还是您要专门处理的 标签?

标签: c# asp.net


【解决方案1】:

您可以将所有行读入一个数组,以便通过索引引用特定行。

【讨论】:

  • 如果您一次读入所有行,您可以使用File.ReadLines,但这不适用于流,看起来 OP 正在读入。
  • 如果您提供的答案是指一种方法,请提供该方法的示例,例如@JGinSD。不确定读取所有行是否值得在文件中获取三行深度。
【解决方案2】:

如果您需要读取特定行而不是使用ReadToEnd,您应该考虑使用ReadLine,那么您应该能够计算读取的行数以了解何时到达该行你需要。

【讨论】:

    【解决方案3】:

    正则表达式可以解决问题。简单例子:

    string test = @"<html>\n<head>\n<title>Access is Granted.</title>\n<style>...";
    string output = Regex.Match(test, "<title>.*</title>").Value;
    

    【讨论】:

      【解决方案4】:

      构建扩展方法:

      public static IEnumerable<string> ReadLines(this StreamReader reader)
      {
           yield return reader.ReadLine();
      }
      

      然后你可以使用LINQ选择你想要的任何一行,下面的例子是选择第三行:

       var result  = streamReader.ReadLines()
                                 .ElementAtOrDefault(2);
      

      您仍然可以通过这种方式利用延迟执行

      【讨论】:

      • 你想要索引 2 处的行,这样做更容易streamReader.ReadLines().ElementAt(2)
      • 仍然认为您需要将其从 3 更改为 2(从零开始的索引)。
      【解决方案5】:

      使用HtmlAgilityPack

      通过它运行响应并提取您需要的行。

      简单明了

      【讨论】:

        【解决方案6】:

        如何使用XmlReader 从 HTML 文档中读取您想要的确切值?由于XmlReader 正在流式传输,您不必像使用数组方法那样阅读整个文档,它会自动为您解析它。这比依赖&lt;title&gt; 标记在某一行更安全。

        using(var reader = XmlReader.Create(myHttpWebResponse.GetResponseStream()))
        {
            reader.ReadToDescendant("title");
            var result = "<title>" + reader.ReadElementString() + "</title>";
            Log("Access", Server.HtmlEncode(result), "Success");
        }
        

        【讨论】:

        • XmlReader 可能无法尝试读取 HTML,因为 HTML 不一定是 XML
        • 是的,我用给定的 HTML 对其进行了测试,似乎可以工作。只有前 3 行需要是有效的 XML,因为 XmlReader 会延迟解析。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        • 2023-02-06
        • 2017-02-12
        相关资源
        最近更新 更多