2015-06-20 15 views
0

需要帮助弄清楚如何处理下面的情况。FileHelpers库转义分隔符时读取流

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

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

您好;世界;富//没有逃脱分隔这里

你好;;世界;富!;! // 2个逃出这里

分离器的前面的例子中两个记录是有效的,必须产生一个对象,其属性是“你好”,“世界”和“富”。

使用给前一个问题在此同一站点的答案(FileHelper escape delimiter) 我想订阅MultiRecordEngine类的公共事件BeforeReadRecord,使用事件处理程序,只需更换出现的所有“!”与空串。

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

不幸的是,使用MultiRecordEngine从流中读取时,事件BeforeReadRecord完全不和事件处理程序代码发射从不执行。 我想从流中读取时没有办法利用BeforeReadRecord事件。

根据FileHelpers库单证(http://filehelpers.sourceforge.net/FileHelpers.MultiRecordEngineMembers.html)似乎没有在这种情况下使用合适的事件。

从流中读取数据时有谁知道一种方法来处理逃脱分离?

感谢您的帮助。

Enrico。

+0

可能的解决方案是实现自定义编码。参考[这个Q/A](http://stackoverflow.com/questions/25118364/is-there-a-such-a-thing-like-user-defined-encoding-fallback) – Graffito

回答

0

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

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

这基本上意味着你必须有BeforeRecordRecordAfterRecordRecord事件订阅或有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。如果你这样做,并且你想忽略基类属性,你应该在类级别设置适当的忽略属性。

+0

有一点要注意的是,我将它与FileHelpers v3.2.5进行了比较 – netniV