导入文本文件时如何指定字段类型?

 

问题:

 我有一个文本文件需要导入 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


特别数据类型转换 
特别数据类型转换主要是定义比如日期、货币型数据如何转换或者如何显示的,你可以参考下面这张表:

选项说明
DateTimeFormatCan 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.
DecimalSymbolCan be set to any single character that is used to separate the integer from the fractional part of a number.
NumberDigitsIndicates the number of decimal digits in the fractional portion of a number.
NumberLeadingZerosSpecifies 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.
CurrencySymbolIndicates the currency symbol to be used for currency values in the text file. Examples include the dollar sign ($) and Dm.
CurrencyPosFormatCan 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 $)

CurrencyDigitsSpecifies the number of digits used for the fractional part of a currency amount.
CurrencyNegFormatCan 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.

CurrencyThousandSymbolIndicates the single-character symbol to be used for separating currency values in the text file by thousands.
CurrencyDecimalSymbolCan 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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页