使用OleDB匯入文字檔時,如何客製化每個欄位的資料型態

使用OleDB匯入文字檔時,如何客製化每個欄位的資料型態

當您嘗試使用OleDB讀取文字檔至DataTable時,由於文字檔無法識別每個欄位的資料型態,因此匯入時可能會與預期的不同,本文將介紹利用Schema.ini來客製化文字檔的資料型態。

本文所使用的csv檔範例如下:

image

下列程式碼範例為使用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欄位被誤判為日期格式,實際上我們想要的是如下圖右的文字格式。

imageimage

 

要修正上述問題,可以利用Schema.ini來定義文字檔的格式,使用Schema.ini必須注意下列事項:

  1. 用來定義文字檔的定義檔必須是Schema.ini(檔案名稱大小寫不拘)。
  2. 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 

【說明】

  1. 第一列用來指定Schema.ini所要定義的文字檔的檔案名稱。
  2. 若文字檔的第一列為表頭,則必須設定ColNameHeader為True。
  3. 設定文字檔的編碼,可以設定的選項為ANSI或OEM。
  4. 設定文字檔的類型,以逗點作為分隔符號請將Format設定為CSVDelimited,以Tab作為分隔符號者設定為TabDelimited,固定長度者設定為FixedLength,若有客製化分隔符號,則設定為Delimited(分隔符號)。
  5. 第五至第13列,用來定義每個欄位的資料型態,可以在此自訂欄位名稱,預設以檔案表頭的定義為主,若要指定長度,則以Width 長度表示,例如第五列Text Width 2,則表示Col1欄位為Text且長度為2。

 

下圖為設定Schema.ini後的執行結果:

image

 

【參考資料】