【问题标题】:Can I make the StreamReader "believe" that EOL is now "###" and not "\n"?我可以让 StreamReader“相信”EOL 现在是“###”而不是“\n”吗?
【发布时间】:2010-07-28 13:15:35
【问题描述】:

我有一个文件,我需要逐行阅读。 每行都以“###”结尾,而不是常规的行尾字符 (\n)。

有什么方法可以改变 streamReader,所以当我使用 ReadLine() 时它会一直读取,直到看到“###”? 如果没有,是否有其他方法可以做到这一点,或者我应该为此目的实现一个新类?

【问题讨论】:

  • 您能否继承 StreamReader 并编写自己的 ReadLine() 方法来扫描“###”?
  • 可能是您最好的选择。我做了类似的事情来创建一个 X12Reader。
  • @FrustratedWithFormsDesigner 以正常方式而不是在 cmets 中回答问题怎么样?您的建议是对的,那么 tamar 应该将什么标记为答案?
  • @ŁukaszW.pl:我不知道,我正要这样做,然后我的某些部分认为会有一个陷阱或“陷阱!”为此,我将其改写为问题并写为评论。现在我有点清醒了,我没有看到任何可能的问题,但由于其他人已经给出了非常相似的答案,我将它作为评论留下。 ;)

标签: c#


【解决方案1】:

不,您不能对 StreamReader 执行此操作。 StreamReader 类经过硬编码以识别\r\n 字符,并且不可配置。您可以使用 .NET Reflector 看到这一点:

char ch = this.charBuffer[charPos];
switch (ch)
{
    case '\r':
    case '\n':
        string str;
        if (builder != null)
        // ...

如果您的文件不是太大,您可以将整个文件读入内存,然后在### 上拆分。如果您需要流式传输行为,那么您可以编写类似于 ReadLineyourself 的内容,但具有您想要的行为。

【讨论】:

    【解决方案2】:

    [笑话] 使用 Moles 框架,您可以更改 Environment.NewLine 的值

          MEnvironemnt.NewLineGet = () => "###"; 
    

    并希望流式阅读器使用它 [/笑话]

    但我想从 streamreader 继承并覆盖一种方法更容易......

    【讨论】:

    • 即使这不是玩笑也行不通。 StreamReader 不使用 Environment.NewLine
    【解决方案3】:

    行尾行为在 StreamReader.ReadLine 中硬编码。

    如果你想覆盖它或者至少看看它是如何工作的,这样你就可以制作你自己的 TextReader,不要忘记你可以从 MS (http://referencesource.microsoft.com/netframework.aspx) 获取框架源代码

    【讨论】:

      【解决方案4】:

      我可以想到两种方法来做到这一点。 第一个是在 StreamReader 上编写一个扩展方法,它可以做你想做的事情并使用它。 第二个是定义一个新的 Encoding 对象,它将 ### 转换为 \n(并可能将 \n 转换为其他内容)。

      【讨论】:

        【解决方案5】:

        一个选项(取决于性能问题)是做一个简单的read() 并在输入流中寻找“###”来做任何你想做的事情。

        【讨论】:

          猜你喜欢
          • 2019-12-15
          • 1970-01-01
          • 1970-01-01
          • 2011-09-10
          • 1970-01-01
          • 2017-12-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多