我有一个文件,我需要逐行阅读。 每行以“###”结尾,而不是以常规行尾字符(\ n)结尾。
有没有办法更改streamReader所以当我使用ReadLine()时它会读取,直到它看到“###”? 如果没有,是否有其他方法可以做到这一点,还是应该为此目的实现一个新类?
答案 0 :(得分:2)
不,您不能使用StreamReader
执行此操作。 StreamReader类是硬编码的,用于识别\r
和\n
个字符,但不可配置。你可以使用.NET Reflector看到这个:
char ch = this.charBuffer[charPos];
switch (ch)
{
case '\r':
case '\n':
string str;
if (builder != null)
// ...
如果您的文件不是太大,您可以将整个文件读入内存,然后在###
上拆分。如果您需要流式传输行为,那么您可以自己编写类似于ReadLine
的内容,但是可以使用您想要的行为。
答案 1 :(得分:0)
[笑话] 使用Moles框架,您可以更改Environment.NewLine的值
MEnvironemnt.NewLineGet = () => "###";
并希望streamreader使用它 [/笑话]
但我想它更容易从streamreader继承并覆盖一个方法......
答案 2 :(得分:0)
行结束行为在StreamReader.ReadLine中进行了硬编码。
如果你想覆盖它或至少看看它是如何工作的,你可以制作自己的TextReader,不要忘记你可以从MS获得框架源(http://referencesource.microsoft.com/netframework.aspx)
答案 3 :(得分:0)
我可以通过两种方式来做到这一点。 第一种是在StreamReader上编写一个扩展方法,它可以执行您想要的操作并使用它。 第二个是定义一个新的Encoding对象,它将###转换为\ n(并可能将\ n转换为其他内容)。
答案 4 :(得分:0)
一个选项(取决于性能问题)是做一个简单的read()
并在输入流中查找“###”以随意执行任何操作。