我需要阅读各种不同的文本文件(我有一些分隔文件和一些固定宽度的文件)。我考虑过逐行解析文件(使用File.ReadLine类型方法慢速)并使用ODBC文本驱动程序读取文件(更快),但有没有人有任何其他(更好)的建议?我正在使用.NET / C#。
答案 0 :(得分:5)
我不确定你真的可以做一个文本和Excel文件解析器,除非Excel文件你的意思是逗号/管道/制表符分隔文件,这实际上只是另一个文本文件。读取实际的Excel文件需要您使用MS Office库。
对于分隔文本文件解析,你可以查看FileHelpers - 开源,它们几乎涵盖了它。不确定它是否符合您的速度要求。
答案 1 :(得分:3)
忽略Excel部分(您认为不重要):
我发现LINQ在解析txt文件时非常有用(管道分隔或csv)
e.g。这会读取一个以管道分隔的文件,跳过hader行并创建一个IEnumerable作为结果:
var records = 来自File.ReadAllLines中的行(@“c:\ blah.txt”)。跳过(1) let parts = line.Split('|') 选择部分;
答案 2 :(得分:3)
回答我自己的问题:
我最终使用了Microsoft.VisualBasic.FileIO.TextFieldParser对象,请参阅:
http://msdn.microsoft.com/en-us/library/f68t4563.aspx
(example of implementation here)
这允许我处理csv文件而不用担心如何处理字段是否用引号括起来,包含逗号,转义引号等。
答案 3 :(得分:1)
如果文件相对较小,您可以使用File类。它有这些方法可以帮助你:
答案 4 :(得分:1)
你的问题有点模糊。我假设文本文件包含结构化数据,而不仅仅是随机文本行。
如果您自己解析文件,那么.NET有一个库函数来读取文本文件中的所有行到字符串数组(File.ReadAllLines)。如果您知道您的文件足够小以容纳在内存中,那么您可以使用此方法并使用正则表达式迭代数组以验证&提取字段。
Excel文件是一种不同的球类游戏。 .XLS文件是二进制文件,而不是文本文件,因此您需要使用第三方库来访问它们。 Excel 2007中的.XLSX文件包含压缩的XML数据,因此您需要再次解压缩XML,然后使用XML解析器获取数据。我不建议您编写自己的XML解析器,除非您觉得需要进行智力练习。
答案 5 :(得分:1)
我同意约翰,
例如: -
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...
}
}
}
答案 6 :(得分:0)
如果使用File类和John建议的方法一次读取所有文件,则文件读取过程并不慢。根据文件的大小以及您要对它们执行的操作,它可能会使用更多或更少的内存。我建议您尝试使用File.ReadAllText(或适合您的任何内容)
答案 7 :(得分:0)
关于阅读XLS文件:
如果您使用的是Microsoft Office XP及更高版本,则可以访问已包含的.NET SDK Office库,您可以在其中“本地”读取XLS文件,Word,PPT等。请注意,在Office XP下,您必须在安装期间手动检查(除非您以前安装过.NET)。
如果您没有Microsoft Office,我不知道这些库是否可作为单独的包提供。
由于某些不明原因,所有这些库(包括Office 2007 -aka:Office 12的最新版本)都是要使用的 pain 的COM组件,导致丑陋的依赖关系并且不向后兼容。 I.E。:如果您有一些方法可以与Office XP(Office11)一起使用,并且您使用Office 12将其安装到客户上,则无法正常工作,因为某些接口已更改。所以你需要维护两个的“库”和方法来处理它。如果使用Office 12库进行编程,并且您的客户拥有Office 11,则同样如此。您的库不起作用。 :S
我不知道为什么微软从未在那些丑陋的东西周围创建一个Microsoft.Office.XXXX托管库(包装器)。
无论如何,你的问题很奇怪,试着在这里提出一些建议。祝你好运!
答案 8 :(得分:0)
ODBC文本驱动程序现在已经过时了 - 它没有Unicode支持。
令人惊讶的是,MS Excel仍然使用它,因此如果您在Excel 2007中打开 Unicode CSV(而不是导入它),则会丢失所有非ASCII字符。
最好的办法是使用.Net的文件阅读方法,正如其他人所建议的那样。