9

我们有一个大约 100,000 行的文本文件,每行大约 50 列,大部分数据都很小(5 到 10 个字符或数字)。

这是一个非常简单的任务,但只是想知道将这些数据导入 C# 数据结构(例如 DataTable)的最佳方法是什么?

4

6 回答 6

9

我会将其作为带有制表符列分隔符的 CSV 读入:

一个快速的 CSV 阅读器

编辑:
这是您需要的一个准系统示例:

DataTable dt = new DataTable();
using (CsvReader csv = new CsvReader(new StreamReader(CSV_FULLNAME), false, '\t')) {
    dt.Load(csv);
}

其中 CSV_FULLNAME 是制表符分隔的 CSV 的完整路径 + 文件名。

于 2010-01-26T22:45:39.723 回答
3

使用 .NET 的内置文本解析器。它是免费的,具有出色的错误处理能力,并且可以处理很多奇怪的问题。

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(VS.80).aspx

于 2010-01-26T23:07:40.343 回答
1

FileHelpers怎么样,您可以将制表符定义为分隔符。通过提供的链接前往该站点并进行偷窥。

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-26T22:59:58.983 回答
0

无论您如何解析这些行,请确保您使用支持转发和倒带的东西,作为数据网格的数据源。您不想先将所有内容加载到内存中,对吗?如果下次数据量应该是十倍呢?做一些使用 file.seek 的东西,不要先把所有的东西都读到内存中。这是我的建议。

于 2010-01-26T23:02:38.110 回答
0

两种选择:

  1. 使用System.Data.OleDb命名空间中的类。这具有直接读取数据表的优势,就像您用很少的代码询问的那样,但是由于它是制表符而不是逗号分隔,因此正确处理可能会很棘手。
  2. 使用或编写 csv 解析器。确保它是基于状态机的解析器,例如链接到的 @Jay Riggs,而不是基于 String.Split() 的解析器。这应该比 OleDb 方法更快,但它会给你一个列表或数组而不是数据表。
于 2010-01-26T22:47:39.823 回答
0

简单,但不一定是好方法:

  • 使用文本阅读器将文件读入字符串

  • 使用 String.Split 获取行

  • 使用带制表符的 String.Split 来获取字段值

于 2010-01-26T23:05:49.273 回答