利用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();
}
}
}
注意代碼中連接字串中的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
其中,定義了3個檔案的不同要求,第一個以逗號分隔,第二個以Tab分隔,第三個以“|”分隔。schema.ini的更強大功能,在如果遇到更特殊要求的時候,再從網上查查吧。時間關係,不細說了。