在byte []中从CSV文件创建强类型DataTable

时间:2009-12-03 08:32:57

标签: c# .net csv datatable

我正在使用C#3和.NET 3.5进行开发,并且有一个对象,其中CSV文件(未知格式)的内容保存在byte []属性中。我需要解析这个byte []并创建一个包含列和行的System.DataTable。

问题是创建一个System.DataTable,其中列数据类型与CSV中的数据匹配。

我目前正在使用CsvReader来解析byte [] CSV,因为这适用于流并且非常快。不幸的是,这只是将所有数据视为字符串。

我尝试使用Jet / OLEDB从CSV文件中读取,这成功创建了一个包含不同数据类型列的DataTable - 但是这需要使用连接字符串我认为它不能用于解析内存中的byte []。

有没有办法可以做到这一点,如果没有,那么推断数据类型并将无类型DataTable转换为具有特定列数据类型的DataTable的合理方法是什么?

2 个答案:

答案 0 :(得分:2)

我想如果Jet / OLEDB可以为文件执行此操作,您可以创建一个内存映射文件并将其提供给Jet。但是,我更愿意通过三个简单的步骤自己完成

1)用CsvReader读取前N行并推导出数据类型(如果所有N看起来像整数,字段是整数等)

2)创建具有适当结构的DataTable

3)重新开始阅读并填写。

答案 1 :(得分:0)

您可以随时查看FileHelpers库:CsvToDataTableReadStreamAsDT,您首先需要将字节数组放入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。)