在c#中逐行过滤流/阅读器的最简单方法是什么(有点像将sed放在管道的中间)。我想将iCalendar文件提供给DDay.iCal,但DDay.iCal死于“版本:5.1.1”,因为它想要一个数字或数字SEMICOLON编号(其中数字是数字(DOT位数)吗?所以最后一个“。”是意外)。
我想做的是将VERSION:行过滤到无害的内容,例如“ VERSION:5.1”,这样解析器就不会死。
更新:
好,这是一个示例:
BEGIN:VCALENDAR
PRODID:-//SunONE/Calendar Hosting Server//EN
METHOD:PUBLISH
VERSION:5.1.1
X-NSCP-CALPROPS-LAST-MODIFIED:20011208T005613Z
X-NSCP-CALPROPS-CREATED:20010913T223336Z
X-NSCP-CALPROPS-READ:999
X-NSCP-CALPROPS-WRITE:999
现在,DDay.iCal解析器不喜欢“ VERSION:5.1.1”,因此我想用诸如“ VERSION:5.1”之类的无害内容替换它。
解析器接口采用阅读器或流。
无论如何,我试图使用代码here,并且它可以工作(在经过过滤的ReadLine顶部重新实现TextReader)。
最佳答案
System.IO.Stream使用装饰器模式,因此可以轻松创建自己的包装基础流的样式。这样,CryptoStream和GZipStream之类的流就可以包装任何其他Stream实例,并有效地“覆盖”其Read / Write方法,而无需派生您要扩展的类。 《四人帮》一书中描述的非常灵活和流行的设计模式。
现在,我不确定您使用的API是否需要Stream或StreamReader。两者之间有很大的区别。 StreamReader在文本级别运行,并在字符/行上进行操作。流在二进制级别工作,并在字节上运行。换句话说,期望StreamReader能够将字节解码为文本,从而使消费者不必担心编码。当编码无关紧要时(例如,进行压缩或加密时),请使用Stream;在处理文本数据时,请使用StreamReader。
听起来,StreamReader在这里更有意义。如果API可以接受StreamReader,则只需从TextReader派生自己的方法,并重写其ReadLine方法,以便第一个调用返回您需要追加的文本行,而后续调用则正常运行。
另一个选择是仅使用StringWriter / StringReader并将其全部填充到内存中的字符串缓冲区中,对其进行操作,然后将其传递。
关于c# - 在C#中过滤流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/994382/