我需要读取各种不同的文本文件(我有一些分隔文件和一些固定宽度的文件)。我考虑过逐行解析文件(使用 File.ReadLine 类型方法很慢)并使用 ODBC 文本驱动程序读取文件(更快),但有人有其他(更好的)建议吗?我正在使用 .NET/C#。
9 回答
我不确定你是否真的可以做一个文本和 Excel 文件解析器,除非 Excel 文件是指逗号/管道/制表符分隔的文件,它实际上只是另一个文本文件。阅读实际的 excel 文件需要您使用 MS Office 库。
对于分隔的文本文件解析,您可以查看FileHelpers - 开源,他们几乎已经涵盖了它。不确定它是否符合您的速度要求。
回答我自己的问题:
我最终使用了 Microsoft.VisualBasic.FileIO.TextFieldParser 对象,请参阅:
http://msdn.microsoft.com/en-us/library/f68t4563.aspx
这使我可以处理 csv 文件,而不必担心如何处理字段是否包含在引号中、是否包含逗号、转义引号等。
忽略 Excel 部分(你说这不重要):
我发现 LINQ 在解析 txt 文件(管道分隔或 csv)方面非常有用
例如,这会读取一个以竖线分隔的文件,跳过 hader 行并创建一个 IEnumerable 作为结果:
var records = from line in File.ReadAllLines(@"c:\blah.txt").Skip(1) let parts = line.Split('|') 选择部分;
如果文件相对较小,您可以使用File类。它有这些方法可以帮助你:
- 读取所有字节
- 读取所有行
- 读取所有文本
你的问题有点含糊。我假设文本文件包含结构化数据,而不仅仅是随机的文本行。
如果您自己解析文件,那么 .NET 有一个库函数可以将文本文件中的所有行读入字符串数组 (File.ReadAllLines)。如果您知道您的文件足够小以保存在内存中,那么您可以使用此方法并使用正则表达式遍历数组以验证和提取字段。
Excel 文件是一个不同的球类游戏。.XLS 文件是二进制文件,而不是文本文件,因此您需要使用第三方库来访问它们。Excel 2007 中的 .XLSX 文件包含压缩的 XML 数据,因此您需要再次解压缩 XML,然后使用 XML 解析器来获取数据。我不建议您编写自己的 XML 解析器,除非您觉得需要进行智力练习。
我同意约翰,
例如:-
using System.IO;
...
public class Program {
public static void Main() {
foreach(string s in File.ReadAllLines(@"c:\foo\bar\something.txt") {
// Do something with each line...
}
}
}
如果您使用 File 类和 John 建议的方法一次读取所有文件,则文件读取过程并不慢。根据文件的大小和你想用它们做什么,它可能会使用更多或更少的内存。我建议您尝试使用 File.ReadAllText (或任何适合您的)
关于读取 XLS 文件:
如果您有 Microsoft Office XP 及更高版本,则可以访问已包含的 .NET SDK Office 库,您可以在其中“本地”读取 XLS 文件、Word、PPT 等。请注意,在 Office XP 下,您必须手动检查在安装期间(除非您之前安装了 .NET)。
如果您没有 Microsoft Office,我不知道这些库是否可以作为单独的包提供。
由于某些模糊的原因,所有这些库(包括 Office 2007 的最新版本 - 又名:Office 12)都是 COM 组件,使用起来很痛苦,导致丑陋的依赖关系并且不向后兼容。IE:如果您有一些适用于 Office XP (Office11) 的方法,并且您将其安装到使用 Office 12 的客户身上,则它不起作用,因为某些界面发生了变化。因此,您需要维护两组“库”和处理方法。如果使用 Office 12 库进行编程,并且您的客户拥有 Office 11,情况也是如此。您的库不起作用。:S
我不知道为什么微软从来没有围绕那些丑陋的东西创建一个 Microsoft.Office.XXXX 托管库(包装器)。
无论如何,您的问题很奇怪,请尝试在此处遵循一些建议。祝你好运!
ODBC 文本驱动程序现在已经过时了——它不支持 Unicode。
令人惊讶的是 MS Excel 仍然使用它,因此如果您在 Excel 2007 中打开Unicode CSV(而不是导入它),您会丢失所有非 ASCII 字符。
正如其他人所建议的那样,最好的办法是使用 .Net 的文件读取方法。