问题:
|
我有一个文本文件需要导入 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 使用数据构架信息文件,那么它的对应的项应该是
指定文件格式
格式说明
[/td]
[td=1,1,50%]
表格式
[/td]
[td=1,1,35%]
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 |
语法如下:
Coln=ColumnName 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 字符集用如下方法:
特别数据类型转换
特别数据类型转换主要是定义比如日期、货币型数据如何转换或者如何显示的,你可以参考下面这张表:
选项 |
说明 |
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 应该类似下面表格:
姓名
[/td]
[td=1,1,30%]单位[/td]
[td=1,1,30%]
联系日期
|
王海 |
上海有机化学研究所 |
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)
|
|