【发布时间】:2015-06-20 21:38:56
【问题描述】:
需要帮助来弄清楚如何处理以下场景。
我们有一个使用 FileHelpers 库来解析 CSV 文件的 .NET 应用程序。 我们不使用物理文件,而是使用 SQL 服务器数据库,其中 CSV 文件存储在 VARBINARY 字段中。我们要做的是使用流阅读器读取二进制内容,并使用适当的多记录引擎对其进行解析。
我们的 CSV 文件使用分号 (;) 作为分隔符,但文件记录可能包含转义分隔符,其中转义字符是感叹号 (!)。 解析文件时必须忽略转义的分隔符。 这意味着必须以相同的方式解析以下记录:
Hello;World;Foo //这里没有转义分隔符
你好!;;世界;Foo!; //这里有两个转义分隔符
前面例子的两个记录都是有效的,并且必须产生一个属性为“Hello”、“World”和“Foo”的对象。
使用同一网站上一个问题的答案 (FileHelper escape delimiter) 我尝试使用事件处理程序订阅 MultiRecordEngine 类的公共事件 BeforeReadRecord,该事件处理程序只需替换所有出现的“!;”带空字符串。
这在使用 MultiRecordEngine.ReadString 方法时效果很好:每次读取记录时都会触发事件 BeforeReadRecord,按预期调用事件处理程序,并将转义的分隔符替换为空字符串。
不幸的是,当使用 MultiRecordEngine 从流中读取时,根本不会触发事件 BeforeReadRecord 并且永远不会执行事件处理程序代码。 我想从流中读取时没有办法利用 BeforeReadRecord 事件。
根据 FileHelpers 库文档 (http://filehelpers.sourceforge.net/FileHelpers.MultiRecordEngineMembers.html),在这种情况下似乎没有合适的事件。
有人知道从流中读取时处理转义分隔符的方法吗?
感谢您的帮助。
恩里科。
【问题讨论】:
-
一种可能的解决方案是实现自定义编码。参考this Q/A
标签: c# csv filehelpers