利用ADO.NET的OleDb方式可以像读取数据库的表一样读取特定格式的文本文件。所谓的特定格式,通常有以下要求:
- 文件的扩展名,最好是txt或者csv
- 文件内各字段之间最好用逗号(,)分隔,当然,也可以用某个特定字符分隔(比如Tab),但只限于用1个字符分隔
- 每一行内容最好以回车结束
这里我们有一个文本文件TestData.txt,其内容为:
姓名,年龄,性别,出生日期
张三,18,男,1981-03-17
李四,24,女,1985-08-08
我们将用OleDb方式从TestData.txt中读取数据并显示到控制台中。
以下是代码:
using System;
using System.Data;
using System.Data.OleDb;
namespace ConsoleForTest
{
class Program
{
static void Main(string[] args)
{
OleDbConnection connect = new OleDbConnection();
connect.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\工作区\练习和测试\TestSolution\ConsoleForTest\bin\Debug\;Extended Properties='Text;HDR=Yes;FMT=Delimited;IMEX=1';Persist Security Info=False";
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [TestData.txt]", connect);
DataTable dt = new DataTable();
da.Fill(dt);
foreach (DataColumn col in dt.Columns)
{
Console.Write("{0}\t", col.ColumnName);
}
Console.WriteLine();
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
Console.Write("{0}\t", row[i].ToString());
}
Console.WriteLine();
}
Console.WriteLine();
Console.Read();
}
}
}
using System.Data;
using System.Data.OleDb;
namespace ConsoleForTest
{
class Program
{
static void Main(string[] args)
{
OleDbConnection connect = new OleDbConnection();
connect.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\工作区\练习和测试\TestSolution\ConsoleForTest\bin\Debug\;Extended Properties='Text;HDR=Yes;FMT=Delimited;IMEX=1';Persist Security Info=False";
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [TestData.txt]", connect);
DataTable dt = new DataTable();
da.Fill(dt);
foreach (DataColumn col in dt.Columns)
{
Console.Write("{0}\t", col.ColumnName);
}
Console.WriteLine();
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
Console.Write("{0}\t", row[i].ToString());
}
Console.WriteLine();
}
Console.WriteLine();
Console.Read();
}
}
}
注意代码中连接字符串中的DataSource参数和命令脚本中的TestData.txt是写死的,实际应用时可能需要动态改写。
最终输出结果为:
姓名 年龄 性别 出生日期
张三 18 男 1981-03-17 0:00:00
李四 24 女 1985-08-08 0:00:00
在连接字符串中,Data Source应该是目标文件的路径。Extended Properties中的Text表明是文本文件,FMT表明文件格式,CSVDelimited或Delimited表明是以逗号为分隔符,HDR=yes表明第一行为字段名行,IMEX=1表明将混合数据转换为文本,默认情况下,如果某列前8行数据中都是纯数字,则此列为数字类型,否则转换为字符类型。
对于命令脚本,From后面跟着文件名就可以了,文件名最好用中括号括起来。
如果文本文件的分隔符比较特殊,则可以在需要读取的文本文件所在的文件夹内,创建一个schema.ini文件,其内容格式类似如下:
[TestData.txt]
ColNameHeader=True
Format=CSVDelimited
MaxScanRows=88
CharacterSet=OEM
[TestDataTwo.csv]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=88
CharacterSet=OEM
[TestDataThree.csv]
ColNameHeader=True
Format=Delimited(|)
MaxScanRows=88
CharacterSet=OEM
ColNameHeader=True
Format=CSVDelimited
MaxScanRows=88
CharacterSet=OEM
[TestDataTwo.csv]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=88
CharacterSet=OEM
[TestDataThree.csv]
ColNameHeader=True
Format=Delimited(|)
MaxScanRows=88
CharacterSet=OEM
其中,定义了3个文件的不同要求,第一个以逗号分隔,第二个以Tab分隔,第三个以“|”分隔。schema.ini的更强大功能,在如果遇到更特殊要求的时候,再从网上查查吧。时间关系,不细说了。