将文本文件(CSV)转换为 DataTable






4.85/5 (12投票s)
一篇关于将文本文件或 csv 文件转换为基于正则表达式的 System.Data.DataSet 的文章
下载 textfiledataset_src.zip - 6 KB
下载 textfiledataset_demo.zip - 15 KB
引言
(最初发布于 2008 年 2 月 18 日)
此代码允许您从文本文件生成并填充一个 DataTable
。 您可以
- 定义您自己的列名或让它们自动创建
- 使用正则表达式验证数据
- 使用
RegexColumnBuilder
在没有正则表达式知识的情况下构建DataTable
- 为生成的
DataTable
指定列类型,而不仅仅是string
类型 - 处理任何类型的文本文件,而不仅仅是分隔文件
- 拥有一组误读的数据行
- 处理大文件
背景
我时不时需要读取一些文本文件以导入数据。 大多数时候,我真正需要的是一个包含该数据的数据集。 但是如何快速将该文本文件转换为数据集呢? CodeProject 上有几篇文章描述了如何将 csv 文件或文本文件转换为数据库或数据集(例如 FinalCSVReader, DataSetFrmDelimTxt)。 但它们都不够灵活,也没有提供数据验证。
使用代码
入门
为了立即开始,让我们假设我们有一个分隔文件 birthday.txt,其内容如下,我们希望从中创建一个 DataTable
1,Chris,12-07-1972 2,Dave,03-01-1974 3,John,03-19-1980,Drummer 4,Mark,12-02-1980 5,Eric,09-18-1981
获取 DataSet
的快速方法是
// open the file
FileStream fileStream = new FileStream("birthday.txt", FileMode.Open, FileAccess.Read);
// create an instance of MyTextFileDataSet
TextFileDataSet MyTextFileDataSet = new TextFileDataSet();
// specify the regular expression for validating and recognising columns
MyTextFileDataSet.ContentExpression = new Regex("^(?<ID>[^,]+),(?<Name>[^,]+),(?<Date>[^,]+)$");
// fill the dataset
MyTextFileDataSet.Fill(fileStream);
// close the file
fileStream .Close();
生成的 MyTextFileDataSet
将包含一个 DataTable
,其中包含三个 DataColumn
: ID、Name 和 Date。 当然,它将被填充四行数据。 四行? 是的,四行。 第 3 行根据正则表达式无效。 您可以在属性 MyTextFileDataSet.MisReads
中找到此行。 此属性的类型为 List<string>
。
想知道列名来自哪里,只需看看使用的正则表达式
^(?<ID>[^,]+),(?<Name>[^,]+),(?<Date>[^,]+)$
您可以看到提供了 DataColumn
的名称。 如果您没有指定名称,而是使您的表达式类似于 ^([^,]+),([^,]+),([^,]+)$,则列的名称将为 1、2 和 3。
没有正则表达式
如果您不熟悉正则表达式,则实现另一种方法来定义列。
这是通过使用 RegexColumnBuilder 实现的。 看看这个例子
RegexColumnBuilder MyColumBuilder = new RegexColumnBuilder();
MyColumBuilder.AddColumn("ID", ',');
MyColumBuilder.AddColumn("DATE", ',');
MyColumBuilder.AddColumn("NAME", ',');
Regex MyRegex = MyColumBuilder.CreateRegularExpression();
MyRegex
可用于放入 MyTextFileDataSet.RegularExpression
中,或者只需将完整的 RegexColumnBuilder 放入 TextFileDataSet 中。
MyTextFileDataSet.ColumnBuilder = MyColumnBuilder;
指定列类型
在前面的示例中,使用合适的分隔符定义了一个列。 此时,有四种已定义的类型可用:INT、DOUBLE、DATE 和 STRING。 使用它们的方式是
MyColumBuilder.AddColumn("ID", ',', RegexColumnType.INTEGER); MyColumBuilder.AddColumn("DATE", ',', RegexColumnType.DATE);
要使指定类型出现在生成的数据集中,必须将 MyColumnBuilder
放入 MyTextFileDataSet.ColumnBuilder
属性中,否则规范始终为 string
类型。
大文件
TextFileDataSet
可以处理大文件,因为它内部使用 System.IO.Stream
作为输入方式。 这也有不需要将文件本身放在磁盘上的额外好处。
关注点
TextFileDataSet
继承了 System.Data.DataSet
,因此您可以使用 TextFileDataSet
执行任何您可以使用 System.Data.DataSet
执行的操作。
如果您不熟悉正则表达式,请查看这些文章并开始
您也可以在 github 上获取此代码:https://github.com/cvanbergen/TextFileDataSet