读取流时的文件帮助程序库转义分隔符

本文关键字:帮助程序 程序库 转义 分隔符 帮助 文件 读取 | 更新日期: 2023-09-27 17:57:13

需要帮助来弄清楚如何处理以下情况。

我们有一个使用 FileHelpers 库来解析 CSV 文件的 .NET 应用程序。我们不使用物理文件,而是有一个SQL服务器数据库,其中CSV文件存储在VARBINARY字段中。我们要做的是使用流阅读器读取二进制内容,并使用适当的多记录引擎对其进行解析。

我们的 CSV 文件使用分号 (;)作为分隔符,但文件记录可能包含转义分隔符,其中转义字符是感叹号 (!)。解析文件时必须忽略转义的分隔符。这意味着必须以相同的方式解析以下记录:

你好;世界;Foo//这里没有转义的分隔符

你好!;;世界;噗!; 此处有两个转义的分隔符

前面示例的两个记录都是有效的,并且必须生成属性为"Hello"、"World"和"Foo"的对象。

在同一站点上使用上一个问题的答案(文件助手转义分隔符)我尝试订阅 MultiRecordEngine 类的公共事件 BeforeReadRecord,使用一个事件处理程序,该处理程序只是用空字符串替换所有出现的"!;"。

这在使用 MultiRecordEngine.ReadString 方法时工作正常:每次读取记录时都会触发事件 BeforeReadRecord,按预期调用事件处理程序,并将转义的分隔符替换为空字符串。

遗憾的是,当使用 MultiRecordEngine 从流中读取时,根本不会触发事件 BeforeReadRecord,并且永远不会执行事件处理程序代码。我想从流读取时没有办法利用 BeforeReadRecord 事件。

根据文件帮助程序库文档 (http://filehelpers.sourceforge.net/FileHelpers.MultiRecordEngineMembers.html),在这种情况下似乎没有适当的事件可以使用。

有谁知道从流读取时处理转义分隔符的方法?

感谢您的帮助。

恩里科。

读取流时的文件帮助程序库转义分隔符

无论你使用的是ReadFile(string fileName) ReadString(string source)还是ReadStream(TextReader reader),它都使用相同的底层函数ReadStream(IRecordReader reader)来解析数据。 引擎必须知道它应该通过MustNotifyRead属性通知读取。 此属性具有以下代码:

return BeforeReadRecord != null ||
       AfterReadRecord != null ||
       RecordInfo.NotifyRead;

这基本上意味着您必须订阅 BeforeRecordRecord AfterRecordRecord 事件,或者INotifyRead您正在读取的类,然后它才会尝试通过仅具有以下代码的 OnBeforeReadRecord(e); 发出任何通知:

if (RecordInfo.NotifyRead)
    ((INotifyRead)e.Record).BeforeRead(e);
if (BeforeReadRecord != null)
    BeforeReadRecord(this, e);
return e.SkipThisRecord;

这基本上意味着,如果你在记录类上有INotifyRead,它会调用 INotifyRead.BeforeRead() 方法和/或 BeforeReadRecord 事件(如果订阅了任何内容)。

但是,由于您使用的是动态选择器,因此我认为它不会检查选定的记录类,而是检查构造函数中的第一种记录类型,因此如果您尝试实现INotifyRead,您应该真正在所有记录上实现它。如果这样做,并且想要忽略基类属性,则应在类级别设置适当的忽略属性。