使用.NET增强阅读和解析文本文件的替代方法

时间:2020-03-05 18:44:54  来源:igfitidea点击:

我需要阅读各种不同的文本文件(我有一些定界文件和一些定宽文件)。我曾考虑过逐行解析文件(使用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文件,而不必担心如何处理字段是否用引号引起来,是否包含逗号,转义的引号等。