What's the best way to read a tab-delimited text file in C#
我们有一个大约 100,000 行的文本文件,每行大约 50 列,大部分数据都很小(5 到 10 个字符或数字)。
这是一个非常简单的任务,但只是想知道将这些数据导入 C# 数据结构(例如 DataTable)的最佳方法是什么?
- 对于 100,000 行,您可能不想将其加载到 DataTable 中。将 SqlBulkCopy 插入数据库时??,您可能需要考虑使用它。
我会将其读取为带有制表符列分隔符的 CSV:
快速 CSV 阅读器
编辑:
这是您需要的一个准系统示例:
1 2 3 4
| DataTable dt = new DataTable ();
using (CsvReader csv = new CsvReader (new StreamReader (CSV_FULLNAME ), false, '\\t')) {
dt .Load(csv );
} |
其中 CSV_FULLNAME 是制表符分隔的 CSV 的完整路径文件名。
- 我会检查一下,有人碰巧有使用制表符列分隔符的示例代码吗?
-
我建议使用这样的东西。您也可以使用 Access/Jet 驱动程序来访问 ADO.Net,但有时会有一些奇怪之处。
-
@AirMan - 我添加了一个简单的示例。
-
我实现了这个并且效果很好,然后被告知公司政策禁止开源,所以我将一个需要两倍时间的对象拼凑在一起。如果可以的话,Fast CSV Reader 似乎是一个不错的选择——开发人员甚至在几分钟内就回答了几个问题。
-
与使用 CsvReader 相比,使用 CachedCsvReader 加载 DataTable 是否有区别,因为无论如何都会将 DataTable 加载到内存中,那么为什么要先使用内存中的 CachedCsvReader 呢?
-
@TimSchmelter您说得对, CsvReader 对OP来说会更好; CachedCsvReader 专为特定的数据绑定场景和较小的数据文件而设计。感谢您指出这一点,答案已更新。
使用 .NET 的内置文本解析器。它是免费的,具有出色的错误处理能力,并且可以处理很多奇怪的问题。
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(VS.80).aspx
-
不,它恰好位于 VB 命名空间中,因为该团队构建了它。您可以从任何 .NET 语言中使用它。
FileHelpers 怎么样,您可以将制表符定义为分隔符。通过提供的链接前往该网站并进行偷窥。
希望这会有所帮助,
最好的祝福,
汤姆。
简单,但不一定是好方法:
-
只是提醒一下 - 有 string[] System.IO.File.ReadAllLines(string path)
无论您如何解析这些行,请确保您使用支持转发和倒带的东西,作为数据网格的数据源。您不想先将所有内容加载到内存中,对吗?如果下次数据量应该是十倍呢?做一些使用 file.seek 的东西,不要先把所有的东西都读到内存中。这是我的建议。
两个选项:
使用 System.Data.OleDb 命名空间中的类。这具有直接读取数据表的优势,就像您用很少的代码询问的那样,但是由于它是制表符而不是逗号分隔,因此正确处理可能会很棘手。
使用或编写 csv 解析器。确保它是基于状态机的解析器,例如链接到的 @Jay Riggs,而不是基于 String.Split() 的解析器。这应该比 OleDb 方法更快,但它会给你一个列表或数组而不是数据表。
-
只是好奇为什么您建议使用基于状态的解析器而不是 String.Split()。
-
主要是性能。但也很难用 string.split 得到像引用文本这样的东西。
-
另外,我所说的"状态机"并不是指正则表达式,它也很糟糕。我的意思是专门为此任务构建的状态机,它可以更好地处理下降/递归。