我正在使用C#3和.NET 3.5进行开发,并且有一个对象,其中CSV文件(未知格式)的内容保存在byte []属性中。我需要解析这个byte []并创建一个包含列和行的System.DataTable。
问题是创建一个System.DataTable,其中列数据类型与CSV中的数据匹配。
我目前正在使用CsvReader来解析byte [] CSV,因为这适用于流并且非常快。不幸的是,这只是将所有数据视为字符串。
我尝试使用Jet / OLEDB从CSV文件中读取,这成功创建了一个包含不同数据类型列的DataTable - 但是这需要使用连接字符串我认为它不能用于解析内存中的byte []。
有没有办法可以做到这一点,如果没有,那么推断数据类型并将无类型DataTable转换为具有特定列数据类型的DataTable的合理方法是什么?
答案 0 :(得分:2)
我想如果Jet / OLEDB可以为文件执行此操作,您可以创建一个内存映射文件并将其提供给Jet。但是,我更愿意通过三个简单的步骤自己完成
1)用CsvReader读取前N行并推导出数据类型(如果所有N看起来像整数,字段是整数等)
2)创建具有适当结构的DataTable
3)重新开始阅读并填写。
答案 1 :(得分:0)
您可以随时查看FileHelpers库:CsvToDataTable或ReadStreamAsDT,您首先需要将字节数组放入TextReader via a chain of streams(可能通过MemoryStream)。< / p>
或者,DIY方法:
您是否尝试过使用DataReader?
参见:DataReader Constructor(流,编码,布尔)
大概你可以在你的字节数组周围包装一个MemoryStream。
然后我猜你可以将它提供给DataAdapter,它可以吐出一个DataSet,你可以从中获得单个DataTable ......
修改强>
我现在意识到您可能已经考虑过使用ADO.Net的各种组件,因为您提到了Jet / ODBC。
我也意识到DataReader的URL来自Biztalk。
我在考虑IDbDataReader接口,当然,你需要一个特定的具体实现,除了Biztalk(你可能没有访问权限)之外,可能没有任何适合你的要求。
也许实施自己的? (不是严肃的建议BTW。)