使用OleDB匯入文字檔時,如何客製化每個欄位的資料型態
當您嘗試使用OleDB讀取文字檔至DataTable時,由於文字檔無法識別每個欄位的資料型態,因此匯入時可能會與預期的不同,本文將介紹利用Schema.ini來客製化文字檔的資料型態。
本文所使用的csv檔範例如下:
下列程式碼範例為使用OleDB讀取csv檔至DataTable,並以foreach迴圈檢視每個欄位的值及資料型態:
1: static void Main(string[] args)
2: {
3: string strCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties='Text;'";
4: using (OleDbConnection con = new OleDbConnection(strCon))
5: {
6: DataTable dt = new DataTable();
7: using (OleDbDataAdapter adapter = new OleDbDataAdapter(@"select * from [Book1.csv]", con))
8: {
9: adapter.Fill(dt);
10: foreach (DataRow dr in dt.Rows)
11: {
12: foreach (DataColumn dc in dt.Columns)
13: {
14: Console.WriteLine(string.Format("{0}={1},{2}", dc.ColumnName, dr[dc.ColumnName].ToString(),dc.DataType));
15:
16: }
17: Console.WriteLine("-----------------------------");
18: }
19: }
20: }
21: Console.ReadKey();
22: }
由下圖左的執行結果綠色框框處看出,TerritoryID欄位被誤判為日期格式,實際上我們想要的是如下圖右的文字格式。
要修正上述問題,可以利用Schema.ini來定義文字檔的格式,使用Schema.ini必須注意下列事項:
- 用來定義文字檔的定義檔必須是Schema.ini(檔案名稱大小寫不拘)。
- Schema.ini必須跟要定義的文字檔在同一目錄。
接下來我們以範例來說明如何撰寫Schema.ini:
1: [Book1.csv]
2: ColNameHeader=True
3: CharacterSet=ANSI
4: Format=CSVDelimited
5: Col1=序號 Text Width 2
6: Col2=ID Text Width 8
7: Col3=一月 Currency
8: Col4=二月 Currency
9: Col5=三月 Currency
10: Col6=四月 Currency
11: Col7=五月 Currency
12: Col8=六月 Currency
13: Col15=更新日期 DateTime
【說明】
- 第一列用來指定Schema.ini所要定義的文字檔的檔案名稱。
- 若文字檔的第一列為表頭,則必須設定ColNameHeader為True。
- 設定文字檔的編碼,可以設定的選項為ANSI或OEM。
- 設定文字檔的類型,以逗點作為分隔符號請將Format設定為CSVDelimited,以Tab作為分隔符號者設定為TabDelimited,固定長度者設定為FixedLength,若有客製化分隔符號,則設定為Delimited(分隔符號)。
- 第五至第13列,用來定義每個欄位的資料型態,可以在此自訂欄位名稱,預設以檔案表頭的定義為主,若要指定長度,則以Width 長度表示,例如第五列Text Width 2,則表示Col1欄位為Text且長度為2。
下圖為設定Schema.ini後的執行結果:
【參考資料】