Access911.net   |   a9BBS   |   OTaA System  
  搜索文章︰  
Access911歡迎您光臨  
   主頁      上傳      简体版       論壇     
設為首頁  |  加入收藏   
  
你現在的位置︰文章索引 -> 文章分類 -> 表  
 首頁|  近日更新|  下載  |  文章索引  |  搜索|  朮語|  承接工程|  
 
系統正在加載內容,請耐心等待...
 
 查詢
 窗体
 報表
 
 
 VBA
 函數
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 發布
 OA
 ASP/ASP.NET
 其他語言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用軟件
 參考文檔
 業主作品
 网友大作
 
 
友情鏈接
 access911.net
 
訪問人次
 1702406
 
站長 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 訂閱

顯示附加信息 >>>

導入文本文件時如何指定字段類型?

作者︰cg1  摘自︰access911.net  ︰cg1  更新日期︰2003-8-2  瀏覽人次︰

 

問題︰

我有一個文本文件需要導入 Access ,但是文本文件中有一列數據原本是文本,但是導入數據庫後自動變成了“雙精度”類型,我該如何讓各個字段按我需要的數據類型生成哪?
如何讓 ACCESS 按照我規定的構架、規格從文本文件、XLS文檔中導入數據?

 

方法一︰

Access 本身就有導入導出向導,里面得高級選項中就可以自定義需要導入數據得詳細規格。

操作步驟如下︰

菜單 -> 文件 -> 獲取外部數據 -> 導入(或者是“鏈接表”) -> 選擇你需要得格式得文件 -> 高級

菜單 -> 文件 -> 獲取外部數據 -> 導入(或者是“鏈接表”)
圖片如下︰
按此在新窗口瀏覽圖片

選擇你需要得格式得文件
圖片如下︰
按此在新窗口瀏覽圖片

點擊“高級”按鈕
圖片如下︰
按此在新窗口瀏覽圖片

在“導入規格”中定義字段規格,定義完成後按“保存”按鈕
圖片如下︰
按此在新窗口瀏覽圖片

選擇合适得規格名
圖片如下︰
按此在新窗口瀏覽圖片

定義完成後得字段規格存儲在 MSysIMEXColumns 以及 MSysIMEXSpecs 表中
圖片如下︰
按此在新窗口瀏覽圖片

完成上述操作後,以後就不用再重新定義了,可以使用以下語句鏈接或者導入文本文件
DoCmd.TransferText acLinkDelim, "list1 導入規格", "list1", "C:\list1.txt"
DoCmd.TransferText acImportDelim, "list1 導入規格", "list1", "C:\list1.txt"

關于 TransferText 方法請參考以下資料(摘自 Access XP 幫助)

TransferText 方法

在 Visual Basic 中,TransferText 方法執行 TransferText 操作。

expression.TransferText(TransferType, SpecificationName, TableName, FileName, HasFieldNames, HTMLTableName, CodePage)
expression   必需。返回“Applies To”列表中的一個對象的表達式。

TransferType  可選 AcTextTransferType。

AcTextTransferType 可以是下列 AcTextTransferType 常量之一︰ 
acExportDelim 
acExportFixed 
acExportHTML 
acExportMerge 
acImportDelim 默認 
acImportFixed 
acImportHTML 
acLinkDelim 
acLinkFixed 
acLinkHTML 
如果將該參數留空,則采用默認常量 (acImportDelim)。

注意   可以鏈接到文本文件或 HTML 文件中的數據上,但數據在 Microsoft Access 中是只讀的。

在 Microsoft Access 項目(Microsoft Access 項目︰与 Microsoft SQL Server 數據庫連接且用于創建客戶/服務器應用程序的 Access 文件。項目文件中不包含任何數據或基于數據定義的對象(如表或視圖)。) (.adp) 中僅支持 acImportDelim、acImportFixed、acExportDelim、acExportFixed 或 acExportMerge 轉換類型。
 

SpecificationName  可選 Variant 型。字符串表達式(字符串表達式︰任一求值為一列連續字符的表達式。表達式的元素可以包括︰返回字符串或字符串 Variant (VarType 8) 的函數;字符串字面值、常量、變量或 Variant。),表示在當前數據庫中創建并保存的導入或導出規格的名稱。對于固定長度的文本文件, 必須指定參數或使用 schema.ini 文件,該文件還必須保存在導入、鏈接或導出的文本文件的同一個文件夾中。若要創建一個方案文件, 可使用文本導入/導出向導創建此文件。對于分隔的文本文件和 Microsoft Word 郵件合并數據文件,可以將該參數留空,以便選擇默認的導入/導出規格。

TableName  可選 Variant 型。字符串表達式,表示要向其導入文本數據、從中導出文本數據或鏈接文本數據的 Microsoft Access 表的名稱,或者要將其結果導出到文本文件的 Microsoft Access 查詢(查詢︰有關表中所存數據的問題,或要對數據執行操作的請求。查詢可以將多個表中的數據放在一起,以作為窗体、報表或數據訪問頁的數據源。)的名稱。

FileName  可選 Variant 型。字符串表達式,表示要從中導入、導出到或鏈接到的文本文件的完整名稱(包括路徑)。

HasFieldNames  可選 Variant 型。使用 True (-1) 可以在導入、導出或鏈接時,使用文本文件中的第一行作為字段名。使用 False (0) 可以將文本文件中的第一行看成普通數據。如果將該參數留空,則采用默認值 (False)。該參數將被 Microsoft Word 郵件合并數據文件忽略,這些文件的第一行中必須包含字段名。

HTMLTableNam  可選 Variant 型。字符串表達式,表示要導入或鏈接的 HTML 文件中的表或列表的名稱。除非 transfertype 參數設為 acImportHTML 或 acLinkHTML,否則該參數將被忽略。如果將該參數留空,則導入或鏈接 HTML 文件中的第一個表或列表。如果 HTML 文件中存在 <CAPTION> 標記,則 HTML 文件的表或列表名稱取決于該標記指定的文本。如果沒有 <CAPTION> 標記,則名稱由 <TITLE> 標記指定的文本決定。如果有多個表或列表具有相同的名稱,則 Microsoft Access 將通過給每個表或列表名稱結尾添加一個數字,如“僱員1”和“僱員2”來區分它們。

CodePage  可選 Variant 型。Long(Long 數據類型︰存儲大型整數的基礎數據類型。Long 變量存儲為 32 位數的值,范圍介于 2,147,483,648 到 2,147,483,647 之間。) 型值,用于標識代碼頁的字符集。

說明
有關該操作及其參數如何使用的詳細信息,請參閱該操作的主題。

語法中的可選參數允許留空,但是必須包含參數的逗號。如果將位于末端的參數留空,則在指定的最後一個參數後面不需使用逗號。

注意   通過設置 Recordset 對象的 ActiveConnection 屬性,也可使用 ActiveX 數據對象 (ADO)(數據訪問對象 (DAO)︰一种數據訪問接口,与 Microsoft Jet 和符合 ODBC 的數據源通訊,以連接到、檢索、操作和更新數據和數據庫結構。) 來創建鏈接。

示例
下面的示例使用規范“標準輸出”,從 Microsoft Access 表“外部報表” 將數據導出到帶有分隔符的文本文件 April.doc 中︰

DoCmd.TransferText acExportDelim, "Standard Output", _
    "External Report", "C:\Txtfiles\April.doc"



 

方法二︰

用 Schema.ini 文件也可以達到要求。

作用︰Schema.ini用于提供文本文件中記錄的構架信息。每個 Schema.ini 項都用于指定表的五個特征之一︰
1、文本文件名
2、文件格式
3、字段名、字段長度、字段類型
4、字符集
5、特別數據類型轉換

指定文件名
文件名要用方括號括起來,例如如果要對 Sample.txt 使用數據構架信息文件,那么它的對應的項應該是
[Sample.txt]


指定文件格式
格式說明 表格式 Schema.ini 格式描述
Tab 制表符分隔 文件中的字段用制表符分隔 Format=TabDelimited
CSV 分隔 文件中的字段用逗號來分隔 Format=CSVDelimited
自定義分隔 文件中的字段可以用任何字符來分隔,所有的字符都可以用來分隔,包括空格,但是雙引號 ( " ) 除外

Format=Delimited(自定義分隔符)

- 或者沒有分隔符 -

Format=Delimited( )

固定寬度 文件中的字段為固定長度 cg1留言,經測試,參數為︰Format=FixedLength


指定字段

你可以有兩种方法在一個字符分隔的文本文件中指定字段名

1、在文本文件中的第一行包含字段名,并且設置 ColNameHeader 為 True 。
2、用數字編號指定每一列并且指定每一列的名字以及數據類型

你必須用數字編號指定每一列并且指定每一列的名字、數據類型以及長度(在固定長度分隔的文本文件中需要指定長度)

注意,設定了 ColNameHeader 選項,在 Schema.ini 中 Windows 注冊時會忽略 FirstRowHasNames 選項。

你也可以指定字段的數據類型,使用 MaxScanRows 選項用來指定在确定列的數據類型時要掃描多少行數據。設置 MaxScanRows 為 0 將掃描整個文件。

如果文本文件第一行包含字段名,并且要掃描整個文件,改項目就要定義如下︰
ColNameHeader=True
MaxScanRows=0

接下來的項目用來指定表中的字段,使用列編號(Coln)選項來指定列。字段長度在“固定分隔文本文件中”是必填項目,在“字符分隔文本文件”中是可選項目。
示例︰定義 2 個字段,CustomerNumber 是長度為 10 的文本字段、CustomerName 是長度為 30 的文本字段。
Col1=CustomerNumber Text Width 10
Col2=CustomerName Text Width 30

語法如下︰
Col[I]n[/I]=[I]ColumnName[/I] type [Width #]

參數解釋如下︰
參數 說明
ColumnName 文本,標識字段名,如果包含空格要用雙引號括起來
type

數據類型包括︰

Microsoft Jet 數據類型︰Bit Byte Short Long Currency Single Double DateTime Text Memo

ODBC 數據類型︰ Char (same as Text) Float (same as Double) Integer (same as Short) LongChar (same as Memo) Date date format

其中date format 是日期的格式字符串例如︰Date YYYY-MM-DD

Width 字符串的長度,後面的數字用來指定字段的長度(“固定分隔文本文件”為必填,“文字分隔文本文件”為可選)
# 整形數字,標識字段長度

指定字符集
CharacterSet 項有兩個選擇︰ANSI | OEM
選擇 ANSI 字符集用如下方法︰
CharacterSet=ANSI


特別數據類型轉換 
特別數據類型轉換主要是定義比如日期、貨幣型數據如何轉換或者如何顯示的,你可以參考下面這張表︰
選項說明
DateTimeFormat
Can be set to a format string indicating dates and times. You should specify this entry if all date/time fields in the import/export are handled with the same format. All Microsoft Jet formats except A.M. and P.M. are supported. In the absence of a format string, the Windows Control Panel short date picture and time options are used.
DecimalSymbol
Can be set to any single character that is used to separate the integer from the fractional part of a number.
NumberDigits
Indicates the number of decimal digits in the fractional portion of a number.
NumberLeadingZeros
Specifies whether a decimal value less than 1 and greater than 每1 should contain leading zeros; this value can either be False (no leading zeros) or True.
CurrencySymbol
Indicates the currency symbol to be used for currency values in the text file. Examples include the dollar sign ($) and Dm.
CurrencyPosFormat
Can be set to any of the following values:

• Currency symbol prefix with no separation ($1)

• Currency symbol suffix with no separation (1$)

• Currency symbol prefix with one character separation ($ 1)

• Currency symbol suffix with one character separation (1 $)

CurrencyDigits
Specifies the number of digits used for the fractional part of a currency amount.
CurrencyNegFormat
Can be one of the following values:

• ($1)

• 每$1

• $每1

• $1每

• (1$)

• 每1$

• 1每$

• 1$每

• 每1 $

• 每$ 1

• 1 $每

• $ 1每

• $ 每1

• 1每 $

• ($ 1)

• (1 $)

This example shows the dollar sign, but you should replace it with the appropriate CurrencySymbol value in the actual program.

CurrencyThousandSymbol
Indicates the single-character symbol to be used for separating currency values in the text file by thousands.
CurrencyDecimalSymbol
Can be set to any single character that is used to separate the whole from the fractional part of a currency amount.

 


下面給出一個簡單的例子,假設有一個表Contacts.txt類似下面︰
姓名 單位 聯系日期 
王海 上海有机化學研究所 2002-1-1 
羅炙 數字化机床研究院 2004-1-1 

導入 Access 應該類似下面表格︰
姓名單位聯系日期
王海上海有机化學研究所2002-1-1
羅炙數字化机床研究院2004-1-1


那么 Schema.ini 則是類似下面的INI文件︰
[Contacts.txt]
ColNameHeader=True
format=Delimited(" ")
MaxScanRows=0
CharacterSet=ANSI
Col1="姓名" Char Width 10
Col2="單位" Char Width 9
Col3="聯系日期" Date Width 8

注釋如下︰
[Contacts.txt] ///文本文件名
ColNameHeader=True ///帶有表頭
format=Delimited( ) ///空格作為分隔符,如果是分號,請用format=Delimited(;) 來解決
MaxScanRows=0 ///掃描整個文件
CharacterSet=ANSI ///ANSI 字符集
Col1="姓名" Char Width 10 ///字段1
Col2="單位" Char Width 9 ///字段2
Col3="聯系日期" Date Width 8 ///字段3
///如果有更多字段可 Col4 .... ColN 

注意,Schema.ini 必須和需要導入的文本文件在同一目錄。

此後,我們就可以利用下面的語句來導入數據了︰

CurrentProject.Connection.Execute "SELECT * INTO NewContact FROM [Text;FMT=Delimited;HDR=Yes;DATABASE=C:\;].[Contacts#txt];"

注意,到 2000 格式的 MDB 為止,以下語句都會導致導入失敗,應該是 Access 本身的問題︰
到 Access XP / access 2003 出現不知道是否已經解決該問題,大家可以在“評論”中告訴我測試結果。
DoCmd.TransferText acImportFixed, , "Contacts", "C:\contacts.txt"

或者
DoCmd.TransferText acImportFixed, "C:\.ini", "Contacts", "C:\Documents.txt"


錯誤消息為︰

運行時錯誤 '3625':
文本文件規范 'c:schema.ini' 不存在。不能使用規范進行導入、導出或者鏈接。

或者
運行時錯誤 '2511':
這個操作或方法需要一個 Specification Name 參數。

另外,請參考︰
http://support.microsoft.com/default.aspx?scid=kb;en-us;241477

這里還有個示例提供下載︰
http://access911.net/down/eg/importtext.rar
(16KB)

 


本站文章旨在為該問題提供解決思路及關鍵性代碼,并不能完成應該由网友自己完成的所有工作,請网友在仔細看文章并理解思路的基礎上舉一反三、靈活運用。

access911.net 原創文章,作者本人對文章保留一切權利。
如需轉載必須征得作者同意并注明本站鏈接


 

 
相關文章
     有關 Schema.ini 的英文參考
     如何更改字段類型或字段長度?
     access升級到SQLServer如何調整字段類型及函數。JET SQL T-SQL同義詞
 
評論
     查看或發表更多的評論,請單擊這里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期︰2000年4月2日  |  設計施工︰陳格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陳格 保留所有權利