使用.NET增强阅读和解析文本文件的替代方法
我需要阅读各种不同的文本文件(我有一些定界文件和一些定宽文件)。我曾考虑过逐行解析文件(使用File.ReadLine类型方法比较慢),并使用ODBC文本驱动程序(更快)读取文件,但是还有人有其他(更好)建议吗?我正在使用.NET / C#。
解决方案
回答
如果文件相对较小,则可以使用File类。它具有以下方法可以:
- ReadAllBytes
- ReadAllLines
- ReadAllText
回答
如果使用File类和John建议的方法一次读取所有文件,则文件读取过程不会很慢。根据文件的大小以及我们要对它们进行的处理,它可能会使用更多或者更少的内存。我建议我们尝试使用File.ReadAllText(或者任何适合方法)
回答
问题有点含糊。我假设文本文件包含结构化数据,而不仅仅是文本的随机行。
如果我们自己解析文件,则.NET具有库功能,可将文本文件中的所有行读取到字符串数组(File.ReadAllLines)中。如果我们知道文件足够小以容纳在内存中,则可以使用此方法并使用正则表达式遍历数组以验证和提取字段。
Excel文件是另一种球类游戏。 .XLS文件是二进制文件,而不是文本文件,因此我们需要使用第3方库来访问它们。 Excel 2007中的.XLSX文件包含压缩的XML数据,因此再次需要解压缩XML,然后使用XML解析器获取数据。我不建议我们编写自己的XML解析器,除非我们认为需要进行智能练习。
回答
我不确定我们是否真的可以执行文本和Excel文件解析器,除非不是Excel文件,否则我们不是用逗号/竖线/制表符分隔的文件,实际上这只是另一个文本文件。读取实际的Excel文件要求我们使用MS Office库。
对于定界的文本文件解析,我们可以查看FileHelpers -open source,他们几乎涵盖了它。不确定是否可以满足速度要求。
回答
关于读取XLS文件:
如果我们具有Microsoft Office XP及更高版本,则可以访问已经包含的.NET SDK Office库,在这里我们可以"本地"读取XLS文件,Word,PPT等。请注意,在Office XP下,我们必须手动检查在安装过程中(除非以前已安装.NET)。
如果我们没有Microsoft Office,我不知道这些库是否作为单独的软件包提供。
由于某些晦涩的原因,所有这些库(包括Office 2007 -a.k.a .: Office 12的最新版本)都是COM组件,使用起来很麻烦,导致难看的依赖关系,并且不向后兼容。 I.E .:如果我们有一些可用于Office XP(Office11)的方法,并且将其安装到具有Office 12的客户上,则该方法将不起作用,因为某些接口已更改。因此,我们需要维护两组"库"和用于处理该问题的方法。如果使用Office 12库进行编程,并且客户拥有Office 11,则同样适用。库不起作用。 :S
我不知道为什么Microsoft从未围绕这些丑陋的事物创建Microsoft.Office.XXXX管理的库(包装器)。
无论如何,问题很奇怪,请尝试在此处遵循一些建议。祝你好运!
回答
忽略Excel部分(我们说这并不重要):
我发现LINQ在解析txt文件(竖线分隔或者csv)中非常有用
例如这将读取以竖线分隔的文件,跳过hader行,并创建IEnumerable作为结果:
var记录=
从File.ReadAllLines(@" c:\ blah.txt")中的行开始。跳过(1)
让零件= line.Split('|')
选择零件;
回答
ODBC文本驱动程序现在已经过时了,它不支持Unicode。
令人惊讶的是,MS Excel仍然使用它,因此,如果在Excel 2007中打开Unicode CSV(而不是将其导入),则会丢失所有非ASCII字符。
我们最好的选择是使用.Net的文件读取方法,就像其他人所建议的那样。
回答
我同意约翰的说法,
例如:-
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... } } }
回答
回答我自己的问题:
我最终使用了Microsoft.VisualBasic.FileIO.TextFieldParser对象,请参阅:
http://msdn.microsoft.com/en-us/library/f68t4563.aspx
(此处的实现示例)
这使我可以处理csv文件,而不必担心如何处理字段是否用引号引起来,是否包含逗号,转义的引号等。