我需要读取各种不同的文本文件(我有一些分隔文件和一些固定宽度文件)。我考虑过逐行解析文件(使用 File.ReadLine 类型方法很慢)并使用 ODBC 文本驱动程序读取文件(更快),但有人有其他(更好)的建议吗?我正在使用 .NET/C#。

有帮助吗?

解决方案 3

回答我自己的问题:

我最终使用了 Microsoft.VisualBasic.FileIO.TextFieldParser 对象,请参阅:

http://msdn.microsoft.com/en-us/library/f68t4563.aspx

(此处的实现示例)

这使我能够处理 csv 文件,而不必担心如何处理字段是否包含在引号中、包含逗号、转义引号等。

其他提示

我不确定你真的可以做一个文本和 Excel 文件解析器,除非 Excel 文件你指的是逗号/管道/制表符分隔的文件,它实际上只是另一个文本文件。读取实际的 Excel 文件需要使用 MS Office 库。

对于分隔文本文件解析,您可以查看 文件助手 ——开源,他们几乎已经涵盖了它。但不确定它是否符合您的速度要求。

忽略Excel部分(你说的不重要):

我发现 LINQ 在解析 txt 文件(管道分隔或 csv)方面相当有用

例如这将读取一个管道分隔的文件,跳过 hader 行并创建一个 IEnumerable 作为结果:

var 记录 = from 行 File.ReadAllLines(@“c:\blah.txt”)。跳过(1) 让零件 = 线。拆分('|') 选择零件;

如果文件比较小,可以使用 文件 班级。它有这些方法可以帮助你:

  • 读取所有字节
  • 读取所有行
  • 读取所有文本

你的问题有点模糊。我假设文本文件包含结构化数据,而不仅仅是随机的文本行。

如果您自己解析文件,则 .NET 有一个库函数可以将文本文件中的所有行读取到字符串数组中 (File.ReadAllLines)。如果您知道您的文件足够小,可以保存在内存中,那么您可以使用此方法并使用正则表达式迭代数组来验证和提取字段。

Excel 文件是一种不同的游戏。.XLS 文件是二进制文件,而不是文本文件,因此您需要使用第 3 方库来访问它们。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 的文件读取方法,正如其他人所建议的那样。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top